2012-04-24 99 views
4

我不是一個大的ORACLE - SQL Expert,所以我希望有人知道一個很好的方法來找到「重複」記錄至極導致:單行子查詢返回多行錯誤。單行子查詢返回多行 - 如何查找重複?

此我聲明:

SELECT 
    CAST(af.SAP_SID AS VARCHAR2(4000)) APP_ID, 
    (SELECT DR_OPTION 
     FROM 
      DR_OPTIONS 
     WHERE DR_OPTIONS.ID = (
      select dr_option from applications where applications.sap_sid = af.sap_sid)) DR_OPTION 
FROM 
    APPLICATIONS_FILER_VIEW af 

它的作品在我的測試系統上,所以IAM「確保」,必須有可用的數據記錄中的錯誤,但我不知道如何去尋找那些..

+0

執行內查詢自己去看看他們返回的.. – gordatron 2012-04-24 10:05:21

+3

嘗試與此查詢:'選擇applications.sap_sid,計數(dr_option)從應用程序組by application.sap_sid具有count(dr_option)> 1'這應該給你重複行的sap_sid – 2012-04-24 10:11:51

+3

@ ABCade的答案應該被複制到答案部分和恕我直言接受。這是這個問題的一般解決方案。 – Karl 2012-04-24 10:19:05

回答

6

與此查詢嘗試一個場景:

select applications.sap_sid, count(dr_option) 
from applications 
group by applications.sap_sid 
having count(dr_option) > 1 

這應該給你複製的行sap_sid

+0

嗡嗡聲無法找到失敗( - : – opHASnoNAME 2012-04-24 11:26:05

+0

@ArneRie,查詢沒有找到任何行? – 2012-04-24 12:11:42

+0

有一些行可以找到,但在測試系統上完整的查詢正在工作( - :查詢與「IN」我認爲這不是正確的解決方案:-) – opHASnoNAME 2012-04-24 12:19:36

1

我建議簡化您的查詢:

SELECT  CAST(af.SAP_SID AS VARCHAR2(4000)) APP_ID, 
      dr.DR_OPTION 
FROM  APPLICATIONS_FILER_VIEW af 
INNER JOIN applications a ON af.sap_sid = a.sap_sid 
INNER JOIN DR_OPTIONS dr ON a.dr_option = dr.ID 
+0

謝謝,但它只是一個更長查詢的「快照」( - : – opHASnoNAME 2012-04-24 10:09:37

+0

)運行上面的查詢應該可以幫助您識別重複行 – weenoid 2012-04-24 10:12:40

1

我會調查你會得到什麼,當你運行:

select dr_option from applications where applications.sap_sid = af.sap_sid 

但您可以強制只返回一行(我認爲這是一個巧克力,並不建議使用它,至少通過對返回的行進行一些控制來添加一個訂單),如下所示:

SELECT 
CAST(af.SAP_SID AS VARCHAR2(4000)) APP_ID, 
(SELECT DR_OPTION 
    FROM 
     DR_OPTIONS 
    WHERE DR_OPTIONS.ID = (
     select dr_option 
     from applications 
     where applications.sap_sid = af.sap_sid 
      and rownumber = 1) 
    ) DR_OPTION 
FROM 
    APPLICATIONS_FILER_VIEW af 

(未測試只是GOOGLE上搜索如何限制結果在Oracle)

如果解決數據問題(按ABCades評論),那麼我會建議將其轉換爲使用加入按weenoid的答案。這也將突出顯示未來可能出現的其他數據問題。

簡而言之:我從來沒有以這種方式固定的東西..真正的答案是,調查多行返回,並且決定要也許做什麼:

  1. 增加更多的where子句
  2. 秩序結果,只選擇最上面一行
  3. 實際上保留副本,因爲它們代表了你有沒有想到過
+2

事實上,他獲得多個結果不會意思是他們都是一樣的(否則他可以使用不同的)。你可以推薦的(儘管它可能不是他想要的)是使用'in'而不是'=' – 2012-04-24 10:21:16

+0

@ABCade抱歉,你的意思是'rownumber在1'或'DR_OPTIONS.ID IN(' – gordatron 2012-04-24 10:24:52

+1

'... WHERE DR_OPTIONS.ID IN(從application.sap_sid = af.sap_sid選擇dr_option)'(刪除'rownumber = 1') – 2012-04-24 10:26:58