我有两张桌子
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
我有两张桌子
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)
将两个表连接在一起,这样您就只有与您感兴趣的类型匹配的记录。
按 对结果集进行分组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
你的解释不是很清楚。我认为您想从表 A 中获取那些 type_uid,其中表 B 中的所有记录都有一个匹配的 A.Allowed_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
(Dems,你比我快:))