2013-07-25 63 views
0

我有我的數據庫中下表:SQL查詢與M:N的關係

sites (SiteID, SiteName) 
parameters(ParameterID, ParameterName, ParameterUnits) 
sites_parameters(SiteID, ParameterID) 

一個站點可以測量零個或多個參數,例如該網站「藍湖」辦法「溫度」和「水水平」。

我需要編寫以下SQL查詢: 查找所有測量所有指定參數的站點。例如,找到所有在同一地點測量溫度,水位和壓力的場所。

對於兩個參數(假設參數的ID爲1和2)下面的查詢工作:

SELECT s.SiteID, s.SiteName, p1.ParameterID, p2.ParameterID 
FROM sites s 
INNER JOIN sites_parameters p1 ON s.SiteID = p1.SiteID 
INNER JOIN sites_parameters p2 ON s.SiteID = p2.SiteID 
WHERE p1.ParameterID = 1 AND p2.ParameterID = 2 

如何編寫查詢,如果我需要找到3個或多個參數的網站嗎?我設法使它工作的唯一途徑是增加一個額外的INNER JOIN語句給每個額外的參數:

SELECT s.SiteID, s.SiteName, p1.ParameterID, p2.ParameterID, p3.ParameterID 
FROM sites s 
INNER JOIN sites_parameters p1 ON s.SiteID = p1.SiteID 
INNER JOIN sites_parameters p2 ON s.SiteID = p2.SiteID 
INNER JOIN sites_parameters p3 ON s.SiteID = p3.SiteID 
WHERE p1.ParameterID = 1 AND p2.ParameterID = 2 AND p3.ParameterID = 3 

是否有書面查詢的任何其他方式?

回答

3
SELECT s.SiteID 
FROM sites s 
INNER JOIN sites_parameters p1 ON s.SiteID = p1.SiteID 
WHERE p1.ParameterID IN (1, 2, 3) 
GROUP BY s.SiteID 
HAVING COUNT(*) = 3 

將所有其他列:

SELECT s.SiteID, s.SiteName, p1.ParameterID 
FROM sites s 
INNER JOIN sites_parameters p1 ON s.SiteID = p1.SiteID 
INNER JOIN (
    SELECT s.SiteID 
    FROM sites s 
    INNER JOIN sites_parameters p1 ON s.SiteID = p1.SiteID 
    WHERE p1.ParameterID IN (1, 2, 3) 
    GROUP BY s.SiteID 
    HAVING COUNT(*) = 3 
)sq ON s.SiteID = sq.SiteID 
+0

謝謝!您的第一個查詢完美無缺。 – jirikadlec2