2010-10-13 14 views
2

比方說,我有類似下面的表格數據:選擇從基於多行的存在SQL的所有行(序列號)

123456 John Doe 1 Green 2001 
234567 Jane Doe 1 Yellow 2001 
234567 Jane Doe 2 Red 2001 
345678 Jim Doe 1 Red 2001 

什麼,我試圖做的僅僅是孤立的Jane Doe的記錄基於她在此表中有多於一行的事實。 (更多的一個序列號) 我不能根據身份證,姓名,顏色,年份等進行隔離...... 序列中的數字1告訴我這是第一條記錄,我需要能夠顯示該記錄,以及第2條記錄 - 更改記錄。

如果該表被稱爲用戶,並且該字段稱爲ID,fname,lname,seq_no,顏色,日期。我如何編寫代碼來選擇只有在這個表中有多行的記錄?例如:

我希望查詢顯示這只是基於多行的存在:

234567 Jane Doe 1 Yellow 2001 
234567 Jane Doe 2 Red 2001 

在PL/SQL

回答

0

退房的彙總查詢的HAVING條款。你可以指定像

HAVING COUNT(*) >= 2 

等等。

4

首先,尋找具有多行記錄的ID,你可以使用:

SELECT ID FROM table GROUP BY ID HAVING COUNT(*) > 1 

所以,你可以得到所有的記錄,所有這些人

SELECT * FROM table WHERE ID IN (SELECT ID FROM table GROUP BY ID HAVING COUNT(*) > 1) 

如果你知道第二個序列ID將始終爲「2」,並且「2」記錄將永遠不會被刪除,您可能會發現類似於:

SELECT * FROM table WHERE ID IN (SELECT ID FROM table WHERE SequenceID = 2) 

會更快,但您最好確保數據庫中的要求得到保證(並且您希望(SequenceID,ID)上有複合索引)。

0

INNER JOIN

JOIN:

SELECT u1.ID, u1.fname, u1.lname, u1.seq_no, u1.color, u1.date 
FROM users u1 JOIN users u2 ON (u1.ID = u2.ID and u2.seq_no = 2) 

WHERE:

SELECT u1.ID, u1.fname, u1.lname, u1.seq_no, u1.color, u1.date 
FROM users u1, thetable u2 
WHERE 
    u1.ID = u2.ID AND 
    u2.seq_no = 2 
1

嘗試像下面這樣。這是一個單一的掃描儀,而不是像其他人一樣。

SELECT * FROM (
    SELECT t1.*, COUNT(name) OVER (PARTITION BY name) mycount FROM TABLE t1 
) 
WHERE mycount >1; 
+0

這是Oracle開始閃耀的地方。 – kevpie 2010-10-13 21:25:11

+0

+1,但是 - 看起來數據具有「人員ID」作爲第一列 - 如果唯一標識一個人,我會在該ID列上執行COUNT(如果有兩個同名的人)。 – 2010-10-14 03:33:17

+0

嘿:)確實,很好的抓住了身份證。是的,您可以輕鬆地用「人員ID」替換「姓名」。 – erbsock 2010-10-14 16:04:31