我有一個人表:如何擺脫SQL中的重複行交叉聯結查詢結果?
要獲得有誰是他們的年齡不足5年之間的差異人員名單,我嘗試:
SELECT *
FROM PERSON p1
CROSS JOIN PERSON p2
WHERE p1.psn_id <> p2.psn_id
AND p1.psn_age - p2.psn_age <= 5;
所以我就:
正如你所看到的,第二行是一樣的第一。我的問題是如何擺脫重複的行?
我有一個人表:如何擺脫SQL中的重複行交叉聯結查詢結果?
要獲得有誰是他們的年齡不足5年之間的差異人員名單,我嘗試:
SELECT *
FROM PERSON p1
CROSS JOIN PERSON p2
WHERE p1.psn_id <> p2.psn_id
AND p1.psn_age - p2.psn_age <= 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;
試試這個:
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不匹配任何驗證了這一點。
不僅第二線基本上是第一個重複的,而且在你的輸出的第三和第四線不符合要求,因爲這些人的年齡之差大於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
;
我想你需要左聯接,如果我理解正確的:
試試這個:
SELECT *
FROM PERSON p1
LEFT JOIN PERSON p2
on p1.psn_id < p2.psn_id
AND ABS(p1.psn_age - p2.psn_age) <= 5;
我不記得是否有一個支持'LEFT JOIN'而沒有'ON'的SQL產品。無論如何,如果你看看[elcodedocle的回答的歷史](http://stackoverflow.com/posts/26191119/revisions),你會發現你目前的建議也是他的第一個建議(並且它沒有工作如評論所見)。 – 2014-10-04 09:29:45
@Andriy M.是的,我忘了添加「ON」子句,我剛剛更新了答案,謝謝。在elcodedocle的答案中,他有用戶交叉連接,我認爲解決方案只是使用左連接 – 2014-10-04 09:38:00
這並不實際工作,即使語法是固定的,它產生的結果相同'交叉join'。 – md4 2014-10-04 08:41:28
你是對的,但我很確定我之前做過這件事,並且離開了加入,我正在查看我的文件,看看我是否找到了某些東西......我會回來讓你知道:-) – NotGaeL 2014-10-04 08:44:27
是的,它產生相同的結果 – Jalil 2014-10-04 08:46:17