我有2个简单的表。
表_1
id | name
===========
1 | Fulan
2 | Abu
3 | Buya
table_2
id_1 | id_2
===========
1 | 2
1 | 3
2 | 1
2 | 3
3 | 1
在表_2中,数据2连接到3,但数据3未连接到2。
如何列出table_1,其中data 3(在table_2中)尚未与data 2连接?,因此我将获得名称“ Abu”
对不起,如果我的问题令人困惑,请先谢谢。
答案 0 :(得分:1)
如果我正确理解了您的问题,那么您希望表1中的所有名称都与表1中的所有其他名称不匹配(即表2中id_2
的所有其他值都在表2中显示为id
) )。您可以使用以下查询来做到这一点:
SELECT t1.id, t1.name
FROM table1 t1
WHERE (SELECT COUNT(*) FROM table2 t2 WHERE t2.id_2 = t1.id) !=
(SELECT COUNT(*)-1 FROM table1)
输出:
id name
2 Abu
修改
基于对问题的澄清,我已更改查询以列出所有未连接的人(其中连接被定义为table2.id_1
= person1和table2.id_2
= person2):>
SELECT t1a.id, t1a.name, t1b.id, t1b.name
FROM table1 t1a
JOIN table1 t1b ON t1b.id != t1a.id
WHERE NOT EXISTS (SELECT * FROM table2 t2 WHERE t2.id_1 = t1a.id AND t2.id_2 = t1b.id)
输出:
id name id name
3 Buya 2 Abu
答案 1 :(得分:0)
从table_1
的交叉自连接(完全外部)开始,将保留排列的完整列表。然后,table2
上的左侧联接(其中table_2.id_2 is null
的条件标准在table_2
中查找与交叉联接不匹配的行。最终标准为t1.id!=t2.id
,以消除自匹配情况。
select t1.id, t2.name from table_1 as t1
cross join table_1 as t2
left join table_2 on t1.id = id_1 and t2.id=id_2
where table_2.id_2 is null
and t1.id!=t2.id;