2015-02-05 3 views
0

У меня есть три таблицы; Графство, кладбище & Могилы. Помеченная колонка в таблице Graves является логической. Результат запроса должен включать количество «отмеченных» могил на каждом кладбище, включая нулевой подсчет.Zero COUNT в JOIN с тремя таблицами

County 
------------------------- 
| CountyID | Name  | 
-------------------------| 
| 351  | Lee  | 
| 352  | Glascock | 
------------------------- 


    Cemetery 
-------------------------------------- 
| CEMID | CountyID | Name   | 
--------------------------------------| 
| 1  |  352 | Smith Family | 
| 2  |  352 | Adams Family | 
| 3  |  352 | Jones Family | 
| 4  |  351 | Harris Family | 
-------------------------------------- 

    Graves 
-------------------------------------- 
| ID | CEMID |  Name  | Marked | 
--------------------------------------| 
| 1 | 1 | John Smith | Y | 
| 2 | 1 | Mary Smith | N | 
| 3 | 1 | Frank Smith | Y | 
| 4 | 1 | Jane Smith | N | 
| 5 | 2 | John Adams | Y | 
| 6 | 2 | Ed Adams  | N | 
| 7 | 3 | Susan Jones | N | 
-------------------------------------- 

    Query Result 
---------------------------------- 
| CEMID |  Name  | Count | 
----------------------------------| 
| 1  | Smith Family | 2 | 
| 2  | Adams Family | 1 | 
| 2  | Jones Family | 0 | 
----------------------------------| 

My current SELECT statement: 

SELECT Cemetery.Name, Cemetery.CEMID, COUNT(Grave.Marked) AS Count 
     FROM Cemetery 
     JOIN County 
     ON Cemetery.CountyID = County.CountyID 
     JOIN Grave 
     ON Cemetery.CEMID = Grave.CEMID 
     WHERE CountyID = 352 
     AND Grave.Marked = TRUE 
     GROUP BY Cemetery.CEMID; 

Это утверждение возвращает результат, но лань не включает Jones родового кладбища, потому что Отмеченное число равно нуль. Я понимаю, что «Grave.Marked = TRUE» находится не в том месте, но где я должен квалифицировать граф, чтобы включить кладбище, где отмеченный счет равен нулю.

ответ

0

Вы хотите использовать left join:

SELECT c.Name, c.CEMID, COUNT(g.Marked) AS Count 
FROM Cemetery c LEFT JOIN 
    Grave g 
    ON c.CEMID = g.CEMID AND g.Marked = TRUE 
WHERE c.CountyID = 352 
GROUP BY c.CEMID; 

Изменения в запросе:

  • Таблица county не нужны. Вы можете получить идентификатор от cemetary.
  • join s сейчас left join.
  • Условие на Marked было переведено в пункт on вместо статьи where.
  • Использование псевдонимов таблицы упрощает запись и чтение.
+0

Спасибо, что сработало. Время выполнения было довольно длинным для запроса. На примере из моей базы данных потребовалось почти 33 секунды с 200 кладбищами и 900 могилами. –

+0

Если этот запрос занимает несколько секунд для заполнения таких небольших данных, вам нужны индексы для столбцов, используемых в 'join'. –

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