在我的数据库中,我有一个表,该表与其他几个表具有多对多关系。我想一次在几条记录中,每个其他表中是否存在一个项目。这是一个简单的示例图:
---------------
| 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。
答案 0 :(得分:3)
您可以使用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没有布尔类型,为此创建一个字符串似乎很愚蠢。
如果您实际上需要名称而不是键值,只需加入即可。
答案 1 :(得分:2)
尽管我喜欢@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。>
有人对此有异议吗?
我对这里列出的SQLFiddle做过操作。 http://sqlfiddle.com/#!18/d6547/28