2014-04-30 91 views
0

說我有以下查詢行:返回只在特定的列(Postgres的)獨特的價值

SELECT id, connected_tracks FROM track_nodes; 

它返回以下行:

1 "1100 1100 1200" 
2 "1100 1100 1300" 
3 "1100 1100 1300" 
4 "1100 1200 1400" 

如何修改我的查詢,所以我只返回沒有重複的行?

使用上面的例子,我只希望返回這些行:

1 "1100 1100 1200" 
4 "1100 1200 1400" 

重要的一點是,我不希望任何重複的行。

我正在使用Postgres 9.3。

每當我尋找方法來做到這一點,我發現很多很多引用使用「DISTINCT」。但據我所知,這不會給我想要的答案 - 我想這也會給我一行「connected_track」值重複的地方。

任何人都可以給我一個指示如何做到這一點?

非常感謝!

+1

鮮明*更快的爲*答案,但目前還沒有任何複製** **行你examp樂此不疲。 – pozs

+0

好吧,我想我的意思是一列上的不同值,而不是行 - 我的錯誤。 – fatbadger

+0

然後,你仍然想要返回1,2和4 *或* 1,3和4.不僅僅是1和4。 – pozs

回答

0

如果你想刪除任何行,其中connected_tracks發生超過每表一次,你需要做一個自我反連接:

SELECT t.id, t.connected_tracks 
    FROM track_nodes AS t 
LEFT JOIN track_nodes AS j 
     ON t.connected_tracks = j.connected_tracks 
     AND t.id <> j.id 
    WHERE j.id IS NULL 
+0

謝謝,就是這份工作。 – fatbadger

+0

我還發現這個工作: SELECT ID,connected_tracks FROM track_nodes如TN WHERE(SELECT COUNT(*)FROM track_nodes WHERE connected_tracks = tn.connected_tracks)<2 也許不是優雅如上雖然該溶液中。 – fatbadger

+0

另外,不能由Posgres正確優化,我想。還有一個「NOT EXISTS」變體,但是Posgres非常聰明,可以將其轉化爲引擎蓋下的反連接變體,這就是我忽略的原因。 – pozs

0
select min(id), 
     connected_tracks 
from track_nodes 
group by connected_tracks 
having count(*) = 1; 

SQLFiddle:http://sqlfiddle.com/#!15/3227e/1

可能比自聯接

+0

謝謝 - 很高興看到不同的做事方式。 – fatbadger