私は2つのテーブルを持っています
Table A
type_uid, allowed_type_uid
9,1
9,2
9,4
1,1
1,2
24,1
25,3
Table B
type_uid
1
2
テーブルから AI が戻る必要がある
9
1
WHERE IN
私が返すことができる句を使用して
9
1
24
私は2つのテーブルを持っています
Table A
type_uid, allowed_type_uid
9,1
9,2
9,4
1,1
1,2
24,1
25,3
Table B
type_uid
1
2
テーブルから AI が戻る必要がある
9
1
WHERE IN
私が返すことができる句を使用して
9
1
24
SELECT
TableA.type_uid
FROM
TableA
INNER JOIN
TableB
ON TableA.allowed_type_uid = TableB.type_uid
GROUP BY
TableA.type_uid
HAVING
COUNT(distinct TableB.type_uid) = (SELECT COUNT(distinct type_uid) FROM TableB)
2 つのテーブルを結合して、関心のあるタイプに一致するレコードのみを取得します。
結果セットを でグループ化しTableA.type_uid
ます。
各グループが に存在するのと同じ数のallowed_type_uid
値を持っていることを確認しTableB.type_uid
ます。
distinct
いずれかのテーブルに重複レコードが存在する可能性がある場合にのみ必要です。両方のテーブルが一意の値のみを持つことがわかっている場合は、削除distinct
できます。
また、TableA のサイズが大きくなると、このタイプのクエリのパフォーマンスが急速に低下することにも注意してください。これは、ここではインデックスが実際にはあまり役に立たないためです。
これは依然として有用な構造ですが、クエリをリアルタイムで実行することをお勧めするものではありません。代わりに、別の永続化/キャッシュされた結果セットを作成するために使用し、必要に応じてそれらの結果を更新するためにのみ使用してください。
または、少し安価なバージョン (リソースに関して):
SELECT
Data.type_uid
FROM
A AS Data
CROSS JOIN
B
LEFT JOIN
A
ON Data.type_uid = A.type_uid AND B.type_uid = A.allowed_type_uid
GROUP BY
Data.type_uid
HAVING
MIN(ISNULL(A.allowed_type_uid,-999)) != -999
あなたの説明はあまり明確ではありません。テーブル B のすべてのレコードに一致する A.Allowed_type_uid があるテーブル A からこれらの type_uid を取得したいと思います。
SELECT T2.type_uid
FROM (SELECT COUNT(*) as AllAllowedTypes FROM #B) as T1,
(SELECT #A.type_uid, COUNT(*) as AllowedTypes
FROM #A
INNER JOIN #B ON
#A.allowed_type_uid = #B.type_uid
GROUP BY #A.type_uid
) as T2
WHERE T1.AllAllowedTypes = T2.AllowedTypes
(民主党、あなたは私より速かったです:))