我有以下用户表
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
答案 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