Соединение SQL Left не отображает все строки слева - PullRequest
0 голосов
/ 25 марта 2011

Итак, примерная структура моих двух таблиц выглядит следующим образом:

Table one: Services
services.id
services.name

Table two: Orders
orders.id
orders.item
orders.service

Таблица 1 содержит список услуг. А вторая таблица - это список заказов. Я пытаюсь сгенерировать список всех заказов на услуги из таблицы два (заказы), но также включить (ноль) услуги, которые не были заказаны. Я знаю, что это то место, куда приходит LEFT JOIN, но, похоже, оно не работает вообще. Он отображает большинство служб, но одна или две записи (из служб) не отображаются. Вот запрос, который я использую до сих пор ..

Любое руководство очень ценится, спасибо!

select services.name,count(orders.service)
from services
LEFT JOIN orders ON services.id=orders.service
WHERE item IN (1,2,3,4)
group by statuses.service;

Ответы [ 2 ]

5 голосов
/ 25 марта 2011

Ваш первоначальный выбор в порядке и должен позволять все записи из таблицы служб до.Однако тогда вы ограничиваете это своим where предложением.Если не было объединения для определенной строки, item будет содержать NULL, из которого отфильтровывается ваше предложение WHERE.

SELECT services.name
   ,COUNT(orders.service)
FROM services
LEFT JOIN orders ON services.id = orders.service
WHERE item IS NULL
    OR item IN ( 1, 2, 3, 4 )
GROUP BY statuses.service;

Простите, если я немного ошибаюсь, я идуиз фона SQL Server.

4 голосов
/ 25 марта 2011

Прежде всего, я считаю, что у вас есть опечатка - statuses.service должен быть services.name, верно?

Так как элемент является столбцом из таблицы заказов, вы должны поместить его в условие соединения:

select services.name,count(orders.service)  
from services  
LEFT JOIN orders ON services.id=orders.service and services.item IN (1,2,3,4)  
group by statuses.service; 

В противном случае вы отфильтровываете услуги без заказов или в чьих заказах есть только элементы, не входящие в (1,2,3,4).

С уважением, Фрэнк

...