选择具有相同名称的记录将得到重复的结果

bZh*_*ang 5 sql oracle

我有一个查询,该查询扫描名称相同但ID不同的人。表结构为Staff(name,id)

我想找到的是具有相同名称但具有不同ID的人(他们是不同的人)。

我确实有两个人的名字和差异ID相同。

+---------+-----+
|  NAME   | ID  |
+---------+-----+
| John S. | 138 |
| John S. | 491 |
+---------+-----+
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有

 select a.name, b.name, a.id, b.id
 from staff a, staff b
 where a.name = b.name and a.id != b.id
Run Code Online (Sandbox Code Playgroud)

但是,当我运行这段代码时,它给出两次输出,分别是

+---------+-----+
|  NAME   | ID  |
+---------+-----+
| John S. | 138 |
| John S. | 491 |
| John S. | 491 |
| John S. | 138 |
+---------+-----+
Run Code Online (Sandbox Code Playgroud)

我知道为什么会这样,因为这两个输出都满足检查条件,但是无论如何我可以抑制已经输出的输出吗?我可以运行一个选择表,并且WHERE ROWNUM <= 2,但是当我有更多同名的人时,这不是最佳选择。

谢谢!

Pரத*_*ீப் 5

我不认为你需要JOIN这个我想找的是那些名字相同但id不同

使用Having子句过滤name's拥有多个的人ID

select NAME   
from yourtable
Group by name 
having count(distinct id)> 1
Run Code Online (Sandbox Code Playgroud)

  • 但这只会返回名称,他想要 ID,我有一种感觉,他希望它的格式为 NAME1,ID1,NAME2,ID2。但是关于避免加入的好主意。 (2认同)

sag*_*agi 3

如果你只想要一个结果,你可以这样做:

 select a.name, b.name, a.id, b.id
 from staff a, staff b
 where a.name = b.name and a.id > b.id
Run Code Online (Sandbox Code Playgroud)

这样,它们之间只有一个组合会满足连接条件,因此,只会返回一个

顺便说一句 - 请避免使用隐式连接语法(逗号分隔)。仅使用join 的显式语法,如下所示:

 SELECT a.name, b.name, a.id, b.id
 FROM staff a
 INNER JOIN staff b
  ON(a.name = b.name and a.id > b.id)
Run Code Online (Sandbox Code Playgroud)