2016-05-12 69 views
0

我有一個很長的複雜(至少對我來說)查詢,它返回我需要的確切數據。唯一的問題是一些ID由於在一個多對一關係的查詢中的一個連接而被重複。我想要做的只是從查詢中獲取輸出,併爲每個唯一ID選擇一行。從重複ID中選擇這一行的方式並不重要,我只是需要以最簡單的方式將它縮減爲每個ID一行。Oracle SQL - 從雜亂的查詢中刪除重複項

換句話說,我還有很長的凌亂查詢給我我需要整齊地命名的列等,但重複的ID的數據:

ID column1 column2 column2... column50 
111 data data data ... data 
111 data data data ... data 
112 data data data ... data 
113 data data data ... data 
113 data data data ... data 
113 data data data ... data 

,我想借此從查詢此輸出並降低

ID column1 column2 column2... column50 
111 data data data ... data 
112 data data data ... data 
113 data data data ... data 

我遇到的挑戰是,我不知道如何把整個輸出從查詢和做的東西與它(如刪除重複項),而不首先將其寫入到一個表,我不能寫入表格。

+0

您必須指定如何選擇每個id的行。 (rowno也許?) – jarlh

+2

此外,編輯您的問題以提供一個(簡短的!)您的查詢的例子,以符合您的示例數據將有所幫助。另外,如果您可以提供一些可以小規模複製您的問題的示例數據,例如「重複」行,它們是否具有每列相同的數據,這將有所幫助?或者數據可能不同,例如。 (id = 111,col1 ='a',col2 = 10)id = 111,col1 ='a',col2 = 20)?如果後者,你想要挑選哪一行? – Boneist

回答

2

如果數據是相同的,那麼最簡單的方法就是將您凌亂的查詢包裹在另一個查詢中,您只需使用SELECT DISTINCT。像這樣:

SELECT DISTINCT * 
FROM (
    your_messy_query 
) 

如果不相同,那麼你可以使用:

SELECT * 
FROM (
    SELECT t.*, 
     ROW_NUMBER() OVER (PARTITION BY id ORDER BY something) AS rn 
    FROM (
    your_messy_query 
) t 
) 
WHERE rn = 1; 

ORDER BY something可能是:

  • 一組特定的列,如果你如何檢索最適當的數據;
  • 或者你可以使用ORDER BY ROWNUM如果你只是想拿走每一組的第一行;
  • ORDER BY NULL如果您想要一個非確定性順序 - 但是,這通常似乎與ORDER BY ROWNUM具有相同的效果。
+0

謝謝,我在看第二個案例(它不完全相同),但我得到了「ORA-00923:FROM關鍵字找不到預期的地方」。我改變了我凌亂的查詢剛需「SELECT * FROM客戶」,以保持它的簡單,我不斷收到同樣的錯誤 - 這裏是完整的查詢 ... SELECT * FROM ( SELECT T * ROW_NUMBER。 ()OVER(PARTITION BY CUSTOMER_ID ORDER BY ROWNUM)AS RN FROM( SELECT * FROM CUSTOMER )噸 ) 其中RN = 1; –

+0

沒關係,我在「SELECT t。*」 –

+0

NP之後找到了缺失的逗號,非常感謝您的幫助,很高興我可以用一些至少大聲笑 –