2015-02-05 56 views
0

我有三張表;縣,公墓&墳墓。格雷夫斯表中的標記列是布爾值。查詢結果應包括每個墓地的「標記」墳墓的數量,包括零計數。加入三個表中的零COUNTs

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; 

該聲明返回的結果,但不包括瓊斯家庭墓地,因爲標記計數爲零。我明白「Grave.Marked = TRUE」的位置是錯誤的,但我應該在哪裏定義Count以包括標記計數爲零的墓地。

回答

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獲取ID。
  • join現在是left join
  • Marked上的條件已移至on子句而不是where子句。
  • 表別名的使用使查詢更易於編寫和閱讀。
+0

謝謝,這工作。查詢的執行時間相當長。我的數據庫用了200個墓地和900個墳墓,這個例子差不多耗時33秒。 – 2015-02-05 17:59:15

+0

如果此查詢需要幾秒鐘才能完成此類小數據,則需要在「join」中使用的列的索引。 – 2015-02-05 21:45:45