0

データベースに次のテーブルがあります。

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

1 つのサイトで 0 個以上のパラメータを測定できます。たとえば、サイト「Blue Lake」では「温度」と「水位」を測定します。

次の SQL クエリを作成する必要があります。指定されたすべてのパラメーターを測定するすべてのサイトを検索します。たとえば、同じサイトで温度、水位、および圧力を測定するすべてのサイトを検索します。

2 つのパラメーター (パラメーター 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

クエリを書く他の方法はありますか?

4

1 に答える 1

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
于 2013-07-25T08:11:29.823 に答える