2

私は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
4

3 に答える 3

3
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 のサイズが大きくなると、このタイプのクエリのパフォーマンスが急速に低下することにも注意してください。これは、ここではインデックスが実際にはあまり役に立たないためです。

これは依然として有用な構造ですが、クエリをリアルタイムで実行することをお勧めするものではありません。代わりに、別の永続化/キャッシュされた結果セットを作成するために使用し、必要に応じてそれらの結果を更新するためにのみ使用してください。

于 2012-04-11T09:30:10.607 に答える
1

または、少し安価なバージョン (リソースに関して):

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
于 2012-04-11T10:03:13.440 に答える
0

あなたの説明はあまり明確ではありません。テーブル 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

(民主党、あなたは私より速かったです:))

于 2012-04-11T09:46:26.790 に答える