简体   繁体   English

具有M:N关系的SQL查询

[英]SQL query with M:N relationship

I have the following tables in my database: 我的数据库中有以下表格:

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

One site can measure zero or more parameters, for example the site "Blue Lake" measures "temperature" and "water level". 一个站点可以测量零个或多个参数,例如,“蓝湖”站点可以测量“温度”和“水位”。

I need to write the following SQL query: Find all sites that measure all specified parameters. 我需要编写以下SQL查询:查找测量所有指定参数的所有站点。 For example, find all sites that measure temperature, water level and pressure at the same site. 例如,找到在同一地点测量温度,水位和压力的所有地点。

For two parameters (supposed the parameter ID's are 1 and 2) the following query works: 对于两个参数(假设参数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

How do I write the query if I need to find sites with 3 or more parameters? 如果我需要查找具有3个或更多参数的网站,该如何编写查询? The only way I managed to make it work is adding an extra INNER JOIN statement for each extra parameter: 我设法使其起作用的唯一方法是为每个额外的参数添加一个额外的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

Is there any other way of writing the query? 还有其他写查询的方式吗?

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

To have all other columns: 要具有所有其他列:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM