如何摆脱SQL交叉连接查询结果中的重复行?

时间:2014-10-04 08:34:23

标签: sql

我有一张PERSON表:

PERSON

为了获得年龄小于5岁的人的名单,我试试:

SELECT *
FROM PERSON p1
CROSS JOIN PERSON p2
WHERE p1.psn_id <> p2.psn_id 
  AND p1.psn_age - p2.psn_age <= 5;

所以我得到了:

RESULT

如您所见,第二行与第一行相同。我的问题是如何摆脱重复的线?

4 个答案:

答案 0 :(得分:5)

SELECT * FROM PERSON p1 
CROSS JOIN PERSON p2 
WHERE 
    p1.psn_id < p2.psn_id
AND 
    ABS(p1.psn_age - p2.psn_age) <= 5;

答案 1 :(得分:3)

试试这个:

select
    *
from
    PERSON a
    inner join
    PERSON b on a.psn_id < b.psn_id and abs(a.psn_age - b.psn_age) <= 5;

它会把老人放在左边。如果出于某种原因你不喜欢它,请将a.psn_age - b.psn_age更改为b.psn_age - a.psn_age

更新,我已经通过添加三个年龄分别为87,84和50的新人来验证这一点,以确保87和84相互匹配,并且50与任何内容都不匹配。

答案 2 :(得分:2)

不仅第二行基本上是第一行的副本,而且输出中的第三行和第四行也不满足要求,因为这些人的年龄之间的差异大于5。

我认为应该足够明确差异不应该是负面的:

SELECT *
FROM PERSON p1
CROSS JOIN PERSON p2
WHERE p1.psn_id <> p2.psn_id
  AND p1.psn_age - p2.psn_age BETWEEN 0 AND 5
;

答案 3 :(得分:0)

如果我理解正确,我认为你需要左联:

试试这个:

SELECT *
FROM PERSON p1
LEFT JOIN PERSON p2
on p1.psn_id < p2.psn_id 
  AND  ABS(p1.psn_age - p2.psn_age) <= 5;