ВЫБЕРИТЕ конкретные записи, когда DISTINCT не сделает это

У меня есть две таблицы:

tbl_Artist
AristID
Name
Info

А также

tbl_Ad
AdID
ArtistID
Venue
DateFrom
DateTo

У артиста может быть несколько объявлений для разных шоу. Я запускаю следующее утверждение, чтобы выбрать артистов в городе в диапазоне дат на основе дат в объявлениях.

SELECT DISTINCT tbl_Artist.Name, tbl_Ad.DateFrom, tbl_Ad.DateTo
FROM tbl_Artist INNER JOIN tbl_Ad ON tbl_Ad.AdID = tbl_Ad.ArtistID
WHERE DateFrom BETWEEN #12/1/2014# AND #12/10/2014#
OR DateTo BETWEEN #12/1/2014# AND #12/10/2014#
OR DateFrom < #12/1/2014# AND DatoTo > #12/10/2014#;

Что дает мне следующий результат:

Artist1   02.12.14 - 10.12.14
Artist2   03.12.13 - 08.12.14
Artist2   03.12.13 - 07.12.14

Дата на одном из шоу заканчивается за день до другого, что заставляет его прийти дважды. Я хочу сделать выбор, который показывает 2 художника на 07.12.14 и 08.12.14, но только один на 10.12.14.

Как мне это решить?

1 ответ

Решение

Прежде всего, меня что-то шокирует FROM tbl_Artist INNER JOIN tbl_Ad ON tbl_Ad.AdID = tbl_Ad.ArtistID предложение объединения должно быть tbl_Ad.ArtistID = tbl_Artist.AristID

Во-вторых, вам нужно видеть, что только 1 строка для шоу артиста имеет 2 разные даты: дата окончания / начала шоу заканчивается в одном и том же диапазоне дат... Я хочу сказать: почему в вашей базе данных у ваших артистов много шоу концы, у которых даты пересекаются? Но я думаю, что это из-за ошибки в предложении соединения. Попробуйте повторить запрос с хорошим соединением.

Если это сохраняется, вы можете использовать MIN() а также MAX() Функция, чтобы получить максимальный диапазон дат для найденных объявлений по исполнителю:

SELECT
    Name
    ,MIN(DateFrom)
    ,MAX(DateTo)
FROM
    (SELECT 
        tbl_Artist.Name
        , tbl_Ad.DateFrom
        , tbl_Ad.DateTo
    FROM 
        tbl_Artist 
        INNER JOIN tbl_Ad 
            ON tbl_Ad.ArtistID = tbl_Artist.AristID
    WHERE 
        DateFrom BETWEEN #12/1/2014# AND #12/10/2014#
        OR DateTo BETWEEN #12/1/2014# AND #12/10/2014#
        OR DateFrom < #12/1/2014# AND DatoTo > #12/10/2014#)
GROUP BY
    Name;
Другие вопросы по тегам