sql - 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。
解决方案
您可以使用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 没有布尔类型,为此目的创建一个字符串似乎很愚蠢。
如果您确实需要名称而不是键值,只需将其加入即可。
推荐阅读
- c# - How to convert whole XAML file to System.Windows.Media.Geometry object?
- utf-8 - Google Actions - 使用 AWS API Gateway 时的 UTF-8 解码
- r - R 在使用 dplyr 过滤时正确使用“rank”
- java - 从 7 更新到 10 后 Jar 文件不会显示资源
- node.js - 在 readline 启动后定义事件处理程序
- php - PHP will not execute bash in Ubuntu server
- swift - 让断点打印调用函数的名称
- javascript - How to verify client-side text in NodeJS?
- javascript - Finding if something is in an array or not in javascript
- excel - 将值与一些字母数字进行比较