2013-07-25 3 views
0

내 데이터베이스에 다음과 같은 테이블이 있습니다, 예를 들어 사이트 "블루 레이크"조치 "온도"와 "물을 0 개 이상의 매개 변수를 측정 할 수SQL 쿼리 : N 관계

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

하나의 사이트에서 수평".

다음 SQL 쿼리를 작성해야합니다. 지정된 모든 매개 변수를 측정하는 모든 사이트를 찾습니다. 예를 들어 동일한 사이트에서 온도, 수위 및 압력을 측정하는 모든 사이트를 찾습니다. 이 매개 변수의

(가정은의 1과 2 인 매개 변수 ID) 다음 쿼리 작동 : 나는 3 개 이상의 매개 변수를 사용하여 사이트를 찾을 필요가 있다면

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 

이 어떻게 쿼리를 작성하려면 어떻게해야합니까? 나는 그것이 작동하도록 관리하는 유일한 방법은 각 추가 매개 변수에 대한 추가 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