SQL,只有匹配所有外键值才返回记录?

标签 sql sql-server sql-match-all relational-division

我有两张 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/

相关文章:

mysql - 在Mysql中连接四个没有重复的右表表?

sql-server - 无法将 SSIS 包部署到 Windows 10 Pro 上的 SQL Server 2016 Express

sql-server - 是否有 64 位版本的 SQL Server Management Studio (SSMS) 2005?

mysql - 使用 MySQL 对四个表进行 SQL 查询 - 'intersection'

mysql - 在不同的行上选择满足不同条件的值?

php - 大于 bigint 的 MySQL 字段

sql - 我们如何删除C中的SQL错误代码1405

mysql - 如何在 MySQL 查询计数中引入完整的 24 个月跨度(包括 NULL 值)

sql-server - 仅连接到 SQL Server 2005 数据库时,SQL Management Studio 2008 有什么好处?

mysql - 如何进行嵌套 bool 过滤器以在elasticsearch中的同一字段上查找精确匹配的值?