非等自连接
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
我有以下用户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