简体   繁体   中英

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. 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:

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? The only way I managed to make it work is adding an extra INNER JOIN statement for each extra parameter:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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