2014-10-04 72 views
2

我有一個人表:如何擺脫SQL中的重複行交叉聯結查詢結果?

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
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

這並不實際工作,即使語法是固定的,它產生的結果相同'交叉join'。 – md4 2014-10-04 08:41:28

+1

你是對的,但我很確定我之前做過這件事,並且離開了加入,我正在查看我的文件,看看我是否找到了某些東西......我會回來讓你知道:-) – NotGaeL 2014-10-04 08:44:27

+0

是的,它產生相同的結果 – Jalil 2014-10-04 08:46:17

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不匹配任何驗證了這一點。

+0

這樣我擺脫每一個第一和第二行,但我只想擺脫其中的一個! – Jalil 2014-10-04 08:54:28

+0

對不起,我錯過了你的要求。更新。 – md4 2014-10-04 08:57:27

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 
;
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; 
+0

我不記得是否有一個支持'LEFT JOIN'而沒有'ON'的SQL產品。無論如何,如果你看看[elcodedocle的回答的歷史](http://stackoverflow.com/posts/26191119/revisions),你會發現你目前的建議也是他的第一個建議(並且它沒有工作如評論所見)。 – 2014-10-04 09:29:45

+0

@Andriy M.是的,我忘了添加「ON」子句,我剛剛更新了答案,謝謝。在elcodedocle的答案中,他有用戶交叉連接,我認爲解決方案只是使用左連接 – 2014-10-04 09:38:00