2015-04-04 4 views
1

Я пытаюсь получить имена клиентов из базы данных, которые не имеют каких-либо событий в апреле 2015 года:INNER JOIN не возвращает ни одной строки

SELECT customer.customerId, customer.Name, event.Date 
FROM customer 
INNER JOIN event ON event.customerId=customer.customerId 
INNER JOIN 
    (
    SELECT eventId AS evid, customerId 
    FROM event 
    WHERE year(event.Date)=2015 AND month(event.Date)=04 
    GROUP BY customerId 
    ) 
EV ON event.eventId = EV.evid 
WHERE event.customerId IS NULL 

Я получаю ноль строк, я должен иметь ок. 20 имен клиентов. Что случилось с запросом?

+0

Почему вы ожидаете, что NULL Id после INNER присоединятся? –

ответ

1

Вы должны использовать левое соединение, и вам нужно только присоединиться к таблице один раз. Вы не можете выбрать дату события, хотя, как вы получаете клиент без событий в интервале:

select 
    customer.customerId, customer.Name 
from 
    customer 
    left join event on event.customerId = customer.customerId 
    and year(event.Date) = 2015 and month(event.Date) = 4 
where 
    event.customerId is null 
+0

Это было проще, чем подумалось, я устаю ...) thx –

1

Это должно дать вам идентификатор клиента и имена всех клиентов, которые не имеют каких-либо события в 2015 году:

SELECT customer.customerId, customer.Name 
FROM customer 
WHERE customerId NOT IN 
(
    SELECT customerId 
    FROM event 
    WHERE year(event.Date)=2015 AND month(event.Date)=04 
) EV; 
+0

Это тоже работает! –

Смежные вопросы