我有一张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;
所以我得到了:
如您所见,第二行与第一行相同。我的问题是如何摆脱重复的线?
答案 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;