SQL将表与自身连接起来
我有一张这样的桌子: +-----------+--------+------------+ | member_id | name | partner_id | +-----------+--------+------------+ | 1 | John | 2 | | 2 | Eva | 1 | | 3 | Peter | 4 | | 4 | Mia | 3 | | 5 | Rachel | null | +-----------+--------+------------+ 我希望它们作为一对夫妇只展示一次。所以当我得到约翰-伊娃时,我不希望伊娃-约翰被展示出来。可以这样做吗?使用左连接: 数据中有重复项,但它们似乎是对称的。一个简单的解决方法是:SQL将表与自身连接起来,sql,right-join,Sql,Right Join,我有一张这样的桌子: +-----------+--------+------------+ | member_id | name | partner_id | +-----------+--------+------------+ | 1 | John | 2 | | 2 | Eva | 1 | | 3 | Peter | 4 | | 4 | Mia |
select m.*, mp.name as partner_name
from (select m.*
from members m
where m.member_id < m.partner_id or
m.partner_id is null
) m left join
members mp
on m.partner_id = mp.member_id;
是一把小提琴。@Mureinik的答案绝对正确。在这种情况下,如果要在name1中隐藏空记录
select m3.name1,m3.name2 from (
SELECT m1.name as name1, m2.name as name2
FROM members m1
RIGHT JOIN members m2 ON m1.member_id = m2.partner_id AND m1.name > m2.name) as m3 where length(m3.name1)>1
无法检索Rachel名称。@June7。子查询没有返回名称。我添加了一个dbfiddle来说明它确实有效。哪个DBMS?您应该始终使用正在使用的DBMS标记SQL问题。永远不要使用正确的外部联接。它们可能很难阅读。总是使用左外连接代替。不,这不是绝对正确的,因为它返回一些伙伴作为单体。您的查询不显示单条。使用dbfiddle检查此项。使用Gordon的小提琴:顺便说一下,代码片段按钮是针对JavaScript和HTML的,而不是针对SQL的。改用代码示例按钮{}。
select m.*, mp.name as partner_name
from members m left join
members mp
on m.partner_id = mp.member_id;
select m.*, mp.name as partner_name
from (select m.*
from members m
where m.member_id < m.partner_id or
m.partner_id is null
) m left join
members mp
on m.partner_id = mp.member_id;
select m3.name1,m3.name2 from (
SELECT m1.name as name1, m2.name as name2
FROM members m1
RIGHT JOIN members m2 ON m1.member_id = m2.partner_id AND m1.name > m2.name) as m3 where length(m3.name1)>1