首页 > 解决方案 > SQL 显示一条记录是否存在于多个表中

问题描述

尽管它看起来与这里的其他问题相似,但这个案例有点不同,我在这里找不到答案。

我有一个恒定的表列表(例如table_1, table_2, table_3, etc...),其中可能有大约 50 个表。这些表可能有不同的方案,但它们都具有id整数类型的列。

有一个整数输入列表,任务是获取一个输出表,其中表名作为列,输入整数作为行,单元格中具有布尔值:TRUE如果相应表中存在具有相应 id 的记录,FALSE否则。

如果可能的话,我想在单个查询中检索结果。

可选地,如果记录存在于所有表中,或者其他情况下,拥有一列exists_in_all也将是完美的。TRUEFALSE

例如:

输入:

111, 222, 333, 444, 123, 456

表:

table_1
ID 一些列
111 'lorem ipsum'
222 '和'
333 '一些'
444 '随机的'
123 '字符串'
table_2
ID 一些列
111 'lorem ipsum'
222 '和'
444 '随机的'
123 '字符串'
table_3
ID 一些列
111 'lorem ipsum'
222 '和'
333 '一些'
444 '随机的'

期望的结果:

ID 存在于所有 表格1 表_2 表3
111 真的 真的 真的 真的
222 真的 真的 真的 真的
333 错误的 真的 错误的 真的
444 真的 真的 真的 真的
123 错误的 真的 真的 错误的
456 错误的 错误的 错误的 错误的

我用SELECT ... WHEERE EXISTS ..., JOINs, UNIONs 做了几次尝试,但不能完全得到我想要的。也许,我没有正确使用它们。

对单个记录的查询也可以工作。

例如:

输入

123

结果
ID 123
存在于所有 错误的
表格1 真的
表_2 真的
表3 错误的

提前致谢!

标签: sql

解决方案


您可以使用条件聚合和union all. “all”列有点棘手,但如果你有一个固定的列表,你可以硬编码你需要的计数:

select id,
       (case when count(*) = 50 then 'True' else 'False' end) as exists_in_all
       max(case when which = 'table1' then 'True' else 'False' end) as in_table1,
       max(case when which = 'table2' then 'True' else 'False' end) as in_table2,
       . . . 
from ((select id, 'table1' as which from table1) union all
      (select id, 'table2' from table2) union all
      . . .
     ) t
where id in ( . . . )
group by id;

您可以使用子查询的视图来简化这一点。


推荐阅读