Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:检查多个表中是否存在多条记录_Sql_Sql Server - Fatal编程技术网

SQL:检查多个表中是否存在多条记录

SQL:检查多个表中是否存在多条记录,sql,sql-server,Sql,Sql Server,在我的数据库中,我有一个与其他几个表具有多对多关系的表。我想知道,对于一次几个记录,其他每个表中是否存在一个项。下面是一个简单的示例图: --------------- | base_table | --------------- | key | name | --------------- | 1 | item1 | | 2 | item2 | | 3 | item3 | | 4 | item4 | --------------- -------------------

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

--------------- 
| 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没有布尔类型,为此创建字符串似乎很愚蠢


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

虽然我喜欢@GordonLindoff的帖子,但我认为以下内容也同样适用:

SELECT DISTINCT
       b.Name,
       in_table_2 = CASE WHEN c.Base_key IS NULL THEN 0 ELSE 1 END,
       in_table_3 = CASE WHEN d.Base_key IS NULL THEN 0 ELSE 1 END
FROM Base_Table b
    LEFT JOIN Table_2 c
        ON b.key = c.Base_Key
    LEFT JOIN Table_3 d
        ON b.key = d.Base_Key;
我还要重申他对SQL中1和0的评论。如果您确实需要在显示中显示“True”或“False”,请在前端执行,或者将case语句中的0和1分别更改为False和True

有人反对吗


我做了一把小提琴,列在这里

我只是好奇你为什么选择这条路线而不是左边的连接?我喜欢这个代码。查看我发布的代码以供参考。@TinyHaitian。在单个表上执行
select distinct
通常比在
join
s的结果上更有效。我希望它在大型表上有更好的性能。这个解决方案和@GordonLindoff为我所做的工作。我确实觉得这本书更容易阅读。