Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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_Right Join - Fatal编程技术网

SQL将表与自身连接起来

SQL将表与自身连接起来,sql,right-join,Sql,Right Join,我有一张这样的桌子: +-----------+--------+------------+ | member_id | name | partner_id | +-----------+--------+------------+ | 1 | John | 2 | | 2 | Eva | 1 | | 3 | Peter | 4 | | 4 | Mia |

我有一张这样的桌子:

+-----------+--------+------------+ | member_id | name | partner_id | +-----------+--------+------------+ | 1 | John | 2 | | 2 | Eva | 1 | | 3 | Peter | 4 | | 4 | Mia | 3 | | 5 | Rachel | null | +-----------+--------+------------+ 我希望它们作为一对夫妇只展示一次。所以当我得到约翰-伊娃时,我不希望伊娃-约翰被展示出来。可以这样做吗?

使用左连接:

数据中有重复项,但它们似乎是对称的。一个简单的解决方法是:

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