具有M:N关系的SQL查询

时间:2013-07-25 08:06:28

标签: sql join

我的数据库中有以下表格:

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

还有其他编写查询的方法吗?

1 个答案:

答案 0 :(得分:4)

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