非Equi自我加入

时间:2016-10-24 06:22:08

标签: sql oracle self-join

我有以下用户表

用户

name    city
A       New York
B       Paris
C       London
D       London
E       Paris

我想使用非equi self join从同一个City中选择两个用户 结果如下:

name  name  city
B     E     Paris
C     D     London

2 个答案:

答案 0 :(得分:2)

“自联接”就像一个普通的连接execpet,同一个表出现在join子句的两边。 “non-equi”表示查找某些列上不匹配的行。

因此,在您的情况下,您需要加入CITY并过滤NAME中的差异:

select t1.name as t1_name
       , t2.name as t2_name
       , t1.city
from users t1
     join users t2
     on t2.city = t1.city
where t1.name < t2.name

请注意,过滤条件为less than:使用not equals会使结果集加倍。(*)

显然,这个解决方案适用于CITY有两个条目的地方。如果有两个以上的条目,您仍将获得多行(每个组合一个)。

(*)有时需要使用!=:如果我们正在调查数据质量问题,那么从两行返回所有列可以帮助我们了解正在发生的事情。

答案 1 :(得分:0)

您可以使用以下方式使用cte

WITH CITY
AS (
SELECT ROW_NUMBER() OVER(PARTITION BY A.CITY ORDER BY A.CITY) RNO,A.NAME,A.CITY FROM Table1 A
)

SELECT A.NAME,B.NAME,A.CITY FROM 
CITY A JOIN 
CITY B
ON 
A.city=B.city AND A.NAME<>B.name AND A.RNO<=B.RNO
相关问题