非等自连接

Non-Equi Self Join

我有以下用户table

用户

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

我想select来自同一个城市的两个用户使用非等自连接 结果如下

name  name  city
B     E     Paris
C     D     London

A "self-join" 就像一个普通的 join execpet,相同的 table 出现在 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 有两个条目的情况。如果有两个以上的条目,您仍然会得到多行(每个组合一个)。


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

您也可以使用以下方式与 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