6

次のデータを含む3つのテーブルがあります

表 3 :

Table1_id        Table2_id
1                1
1                2
1                3
2                1
2                3
3                2

表 2 :

Table2_id        Name
1                A
2                B
3                C

表1 :

Table1_id        Name
1                P
2                Q
3                R

表 3 のすべての Table2_id のエントリを持つすべての table1_id を返す必要があるという問題があります
。出力を

Table1_id
1

count() を使用して解決策を見つけました。しかし、クエリを解決するために all() または exists() を使用する方法はありますか?

4

3 に答える 3

3

NOT IN副選択での除外LEFT JOINでの使用CROSS JOIN

select *
from table1
where Table1_id not in (
    select t1.Table1_id
    from table1 t1
    cross join table2 t2
    left join table3 t3 using (Table1_id, Table2_id)
    where t3.Table1_id is null
)

VS使用COUNT()

select table1_id 
from table3 
group by table1_id 
having count(1) = (select count(1) from table2)

説明:

CROSS JOIN

    select t1.Table1_id
    from table1 t1
    cross join table2 t2

は、 のすべてのアイテムが のすべてのアイテムに関連するtable3場合、どのように見えるかを表します。table1table2

(自然な) left join withは、table3どの関係が実際に存在するかを示します。where t3.Table1_id is null( を除く) でフィルタリングするLEFT JOINと、欠落している関係が得られます。その結果をNOT IN句に使用すると、table2 との関係が欠落していない table1 アイテムのみが得られます。

于 2016-03-28T09:42:39.520 に答える
2

次のクエリを使用できます。

SELECT DISTINCT t1.*
FROM Table2 AS t2
CROSS JOIN Table1 AS t1
WHERE NOT EXISTS (SELECT 1
                  FROM Table3 AS t3
                  WHERE t1.Table1_id = t3.Table1_id AND        
                        t2.Table2_id = t3.Table2_id)

Table1からエントリの完全なセットを持たないレコードを取得Table2しますTable3。次にNOT IN、期待される結果を得るために使用します。

于 2016-03-28T09:00:09.987 に答える
0

EXISTSと を使用したソリューションを次に示しINNER JOINます。

SELECT DISTINCT t3_out.Table1_id FROM Table3 t3_out
WHERE EXISTS( SELECT 1
    FROM Table2 t2 INNER JOIN Table3 t3 ON t2.Table2_id = t3.Table2_id
    WHERE t3.Table1_id = t3_out.Table1_id
    HAVING COUNT(DISTINCT t2.Table2_id) = 3 )
于 2016-03-28T09:52:57.847 に答える