2014-01-20 75 views
0

假設我有一個包含兩列,一個id(bigint)和text(text)的數據庫。我想查找數據庫中所有具有多行發生ID的行。我怎麼能這樣做?查找在某個列中出現多次值的所有行

例子:

1; foo 
2; bar 
3; baz 
2; fubar 
4; blah 
3; bleh 

所需的輸出:

2; bar 
2; fubar 
3; baz 
3; bleh 

我是很新的SQL。我有一個概念,我想沿線

SELECT id,text FROM mytable ORDER BY id ASC; 

但我不知道如何消除id是唯一的行。我基本上需要與SELECT DISTINCT相反。提前致謝!

+1

據我所知,我不認爲有這樣做的一個簡單的方法,沒有使用嵌套查詢。 您是否嘗試過使用'GROUP BY'和'HAVING'來顯示具有重複ID的行? 'SELECT COUNT(*),id,text FROM my_Table GROUP BY id HAVING count(id)> 1' – Yani

回答

4

你可以用窗口函數做到這一點:

select id, text 
from (select t.*, count(*) over (partition by id) as cnt 
     from table t 
    ) t 
where cnt > 1; 
+0

這裏應該是我桌子的名字嗎?我對第三行關閉文件之外的't'感到困惑 – PurpleVermont

+0

@PurpleVermont第三行中的't'是括號中子查詢的名稱。您可以將其更改爲任何名稱。你的表的名字轉到'from'部分而不是'table'。 –

+0

啊,謝謝,我很困惑,因爲它和parens裏面的表名是一樣的變量。另外我認爲'FROM TABLE'是錯誤的,我們只需要'FROM',對吧?爲什麼子查詢需要/得到一個名字,如果它從未被引用? – PurpleVermont

1

事情是這樣的:

WITH more_than_one AS (SELECT id,count(*) FROM table1 GROUP BY id HAVING count(*) > 1) 
SELECT * FROM table1 JOIN more_than_one ON table1.id = more_than_one.id; 
+0

謝謝!我越來越接近你的AS條款,但是我不認爲如果沒有你的幫助,我會得到所有的東西。 – PurpleVermont

+1

使用窗口函數,查詢可以在一次掃描中完成。您當前的查詢執行2次掃描和連接。 –

相關問題