1

これは私にとってかなりの口いっぱいです。私の課題の 1 つは、質問を定式化する方法がわからないことです。これは、タイトルからも明らかです。

私の問題を説明しようとします:

私はテーブルを持っています、A:

ID    LocationID
11    185
12    185
13    206

そしてテーブルB:

ID    AID    Position    Value
1     11     1           4
2     11     3           8
3     11     5           4
4     12     1           4
5     12     2           4
6     12     3           5

テーブル B は、IDおよびによってテーブル A に関連付けられていますAID。次のフィルターを持つクエリを作成したいと思います: Position = 1 AND Value = 4andは、指定されたすべての基準を安定Position = 3 AND Value = 5させる個別の ID のリストを提供します。A.ID

これは、INNER JOIN で 2 つのテーブルを結合する場合、必要なのはA.ID = 12.

この問題を解決するための私自身の出発点は、次のようなものでした。

SELECT DISTINCT A.ID
FROM A
    INNER JOIN B ON (A.ID = B.AID)
WHERE
    A.LocationID = 185 AND
    (B.Position = 1 AND B.Value = 4) OR
    (B.Position = 3 AND B.Value = 5)

これは明らかに機能しません。これには明確な解決策があると思っていましたが、考えてみると、本当にそうではありません。

私はこの問題に少し困惑しており、検索でどのキーワードを使用すればよいかさえわからないため、解決方法の戦略を探すのに苦労しています.

4

3 に答える 3

1

GROUP BYと でこれを行うことができますHAVING

SELECT A.ID
FROM A
    INNER JOIN B ON (A.ID = B.AID)
GROUP BY A.ID
HAVING MAX(CASE WHEN A.LocationID = 185 THEN 1 END) = 1
   AND MAX(CASE WHEN B.Position = 1 AND B.Value = 4 THEN 1 END) = 1 
   AND MAX(CASE WHEN B.Position = 3 AND B.Value = 5 THEN 1 END) = 1

デモ: SQL フィドル

実際にLocationID基準を次の場所に移動できますWHERE:

SELECT A.ID
FROM Table1 A
    INNER JOIN Table2 B ON (A.ID = B.AID)
WHERE A.LocationID = 185
GROUP BY A.ID
HAVING MAX(CASE WHEN B.Position = 1 AND B.Value = 4 THEN 1 END) = 1 
   AND MAX(CASE WHEN B.Position = 3 AND B.Value = 5 THEN 1 END) = 1
于 2015-02-02T00:59:09.440 に答える
0
SELECT DISTINCT A.ID
FROM A
WHERE A.ID IN(
    SELECT ID 
FROM B
WHERE    (B.Position = 1 AND B.Value = 4) OR
    (B.Position = 3 AND B.Value = 5)

)

私があなたを正しく理解していれば。

SELECT DISTINCT A.ID FROM A INNER JOIN B ON (A.ID = B.AID) WHERE A.LocationID = 185 AND (B.Position = 1 AND B.Value = 4) OR (B.Position = 3 AND B.値 = 5)

于 2015-02-02T01:11:32.573 に答える