如何在与自身连接表时排除重复的行

Rob*_*mas 4 sql oracle group-by outer-join

这是一个示例表来帮助说明我的问题:

mysql> select * from test;
+----+--------------+--------+
| id | type         | siteid |
+----+--------------+--------+
|  1 | First Visit  |    100 |
|  2 | Second Visit |    100 |
|  3 | First Visit  |    300 |
|  4 | First Visit  |    400 |
|  5 | Second Visit |    500 |
|  6 | Second Visit |    600 |
+----+--------------+--------+
Run Code Online (Sandbox Code Playgroud)

我正在尝试将表连接到自身,将具有相同siteid值的行组合在一起.这是我的尝试:

mysql> select * from test T1
    -> LEFT OUTER JOIN test T2 on T1.siteid = T2.siteid and T1.id <> T2.id;
+----+--------------+--------+------+--------------+--------+
| id | type         | siteid | id   | type         | siteid |
+----+--------------+--------+------+--------------+--------+
|  1 | First Visit  |    100 |    2 | Second Visit |    100 |
|  2 | Second Visit |    100 |    1 | First Visit  |    100 |
|  3 | First Visit  |    300 | NULL | NULL         |   NULL |
|  4 | First Visit  |    400 | NULL | NULL         |   NULL |
|  5 | Second Visit |    500 | NULL | NULL         |   NULL |
|  6 | Second Visit |    600 | NULL | NULL         |   NULL |
+----+--------------+--------+------+--------------+--------+
Run Code Online (Sandbox Code Playgroud)

这基本上是我正在寻找的结果,除了前2行.我想消除其中一个.所以,我尝试了以下内容:

mysql> select * from test T1
    -> LEFT OUTER JOIN test T2 on T1.siteid = T2.siteid and T1.id <> T2.id
    -> GROUP BY T1.siteid;
+----+--------------+--------+------+--------------+--------+
| id | type         | siteid | id   | type         | siteid |
+----+--------------+--------+------+--------------+--------+
|  1 | First Visit  |    100 |    2 | Second Visit |    100 |
|  3 | First Visit  |    300 | NULL | NULL         |   NULL |
|  4 | First Visit  |    400 | NULL | NULL         |   NULL |
|  5 | Second Visit |    500 | NULL | NULL         |   NULL |
|  6 | Second Visit |    600 | NULL | NULL         |   NULL |
+----+--------------+--------+------+--------------+--------+
Run Code Online (Sandbox Code Playgroud)

这正是我正在寻找的输出.但是,我开始了解这不是使用GROUP BY的标准方法,上面的语句在ORACLE上失败了,给了我一个

一般SQL错误.
ORA-00979:不是GROUP BY表达式

任何人都可以提供一些帮助,如何获得像最后一个表和ORACLE一样的结果?

Roe*_*ler 6

只需从查询中删除一个字符,它就可以完成工作......(将"<>"替换为"<"):

select * from test T1
LEFT OUTER JOIN test T2 on T1.siteid = T2.siteid and T1.id < T2.id
Run Code Online (Sandbox Code Playgroud)