首页 > 解决方案 > SQL:检查多个表中是否存在多条记录

问题描述

在我的数据库中,我有一个与其他几个表具有多对多关系的表。对于一次多条记录,我想知道其他每个表中是否存在一个项目。这是一个简单的示例图:

--------------- 
| base_table  |
---------------
| key | name  |
---------------
| 1   | item1 |
| 2   | item2 |
| 3   | item3 |
| 4   | item4 |
---------------

-------------------------------
| table_2                     |
-------------------------------
| key | base_key  | other_key |
-------------------------------
| 1   | 1         | 1         |
| 2   | 1         | 2         |
| 3   | 1         | 3         |
| 4   | 2         | 1         |
| 5   | 2         | 4         |
| 6   | 4         | 4         |
-------------------------------

-------------------------------
| table_3                     |
-------------------------------
| key | base_key  | other_key |
-------------------------------
| 1   | 2         | 1         |
| 2   | 3         | 2         |
-------------------------------

然后我正在寻找这样的输出:

-----------------------------------
| name  | in_table_2 | in_table_3 |
-----------------------------------
| item1 | true       | false      |
| item2 | true       | true       |
| item3 | false      | true       |
| item4 | true       | false      |
-----------------------------------

我正在使用 MS SQL Server。

标签: sqlsql-server

解决方案


您可以使用union all和聚合来获取哪些键在哪些表中:

select base_key, max(in_2) as in_2, max(in_3) as in_3
from ((select distinct base_key, 1 as in_2, 0 as in_3
       from table2
      ) union all
      (select distinct base_key, 0 as in_2, 1 as in_3
       from table3
      )
     ) t
group by base_key;

如果键在表中,则返回“1”,否则返回“0”。SQL Server 没有布尔类型,为此目的创建一个字符串似乎很愚蠢。

如果您确实需要名称而不是键值,只需将其加入即可。


推荐阅读