我有两张 table
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
我需要从表 A 返回
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 大小的增长,此类查询的性能将迅速下降。这是因为索引实际上并没有多大帮助。
它仍然是一种有用的结构,但我不建议实时运行查询。而是使用它来创建另一个持久/缓存的结果集,并仅在需要时使用它来刷新这些结果。
关于SQL,只有匹配所有外键值才返回记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10103174/