2012-04-26 66 views
-2

以下是我對結果的Oracle選擇查詢,但是我得到了我不需要的重複項。我認爲很難找到其他人,請嘗試一下。在我的oracle選擇查詢中獲取重複項

SELECT I.EID       EID, 
     I.WT       Title, 
     I.RID       RID, 
     I.FORMNAME     STAGENAME, 
     I.FORMS      STATUS, 
     I.INPT      Projects, 
     To_char(I.DVDD, 'DD/MM/YYYY') DVDD, 
     CASE 
     WHEN B.SID = 2 
       AND B.DID = 2 THEN Trunc(F.EVENTDATE) - I.DVDD 
     ELSE NULL 
     END       DEVLAPSEDAYS, 
     To_char(I.MDD, 'DD/MM/YYYY') MDD, 
     CASE 
     WHEN B.SID = 2 
       AND B.DID = 2 THEN Trunc(F.EVENTDATE) - I.MDD 
     ELSE NULL 
     END       MONITORLAPSEDAYS, 
     L.LDEID      LEADEID 
FROM table1 I, 
     table2 F, 
     table3 B, 
     table4 L 
WHERE I.ACTIVEFLG = 1 
     AND I.LATESTFLG = 1 
     AND I.FORMSTATUS IN (1, 3) 
     AND I.UNIQUEID = F.UNIQUEID 
     AND B.SID = 2 
     AND B.DID IN (2, 3) 
     AND (F.EVENTDATE > I.DVDD 
       OR F.EVENTDATE > I.MDD) 
     AND ((Trunc(F.EVENTDATE) - I.DVDD) > 2 
       OR (Trunc(F.EVENTDATE) - I.MDD) > 2) 
     AND F.LINKID = B.LINKID 
     AND I.FORMSTAGENAME IN ('Develop', 'Monitor') 

回答

0

我有這方面的信息做的最好的就是告訴大家,以便將整個查詢:

GROUP BY I.EID,I.WT,I.RID,I.FORMNAME,I.FORMS,I.INPT, 
    To_char(I.DVDD, 'DD/MM/YYYY') DVDD, 
    CASE 
    WHEN B.SID = 2 
      AND B.DID = 2 THEN Trunc(F.EVENTDATE) - I.DVDD 
    ELSE NULL 
    END, 
    To_char(I.MDD, 'DD/MM/YYYY') MDD, 
    CASE 
    WHEN B.SID = 2 
      AND B.DID = 2 THEN Trunc(F.EVENTDATE) - I.MDD 
    ELSE NULL 
    END, 
    L.LDEID 
+0

有OP中的SQL笛卡爾積造成重複行。 – Ollie 2012-04-27 14:03:21

+0

這是正確的,沒有加入任何... – mindandmedia 2012-04-27 15:51:01

2

你沒有連接TABLE4(別名爲L)任何其他表的您的列表從而創建笛卡爾產品。 這很可能會生成您的重複記錄。
加入TABLE4到其他表格之一,你應該很好去。

見笛卡爾乘積中:http://docs.oracle.com/cd/B14117_01/server.101/b10759/queries006.htm

這也是使用SQL-92語法在舊的SQL-96很好的理由。它迫使你明確指定你的表連接。
我用SQL-92重寫了你的查詢,你只需要插入TABLE4的連接條件,它應該適合你。

希望它可以幫助...

SELECT I.EID       EID, 
     I.WT       Title, 
     I.RID       RID, 
     I.FORMNAME     STAGENAME, 
     I.FORMS      STATUS, 
     I.INPT      Projects, 
     To_char(I.DVDD, 'DD/MM/YYYY') DVDD, 
     (CASE 
      WHEN B.SID = 2 
      AND B.DID = 2 
      THEN Trunc(F.EVENTDATE) - I.DVDD 
      ELSE NULL 
     END)       DEVLAPSEDAYS, 
     To_char(I.MDD, 'DD/MM/YYYY') MDD, 
     (CASE 
     WHEN B.SID = 2 
      AND B.DID = 2 
     THEN Trunc(F.EVENTDATE) - I.MDD 
     ELSE NULL 
     END)       MONITORLAPSEDAYS, 
     L.LDEID      LEADEID 
    FROM table1 I 
INNER JOIN table2 F ON (I.UNIQUEID = F.UNIQUEID) 
INNER JOIN table3 B ON (F.LINKID = B.LINKID) 
INNER JOIN table4 L ON (<insert join clause here>) 
WHERE I.ACTIVEFLG = 1 
    AND I.LATESTFLG = 1 
    AND I.FORMSTATUS IN (1, 3) 
    AND B.SID = 2 
    AND B.DID IN (2, 3) 
    AND (F.EVENTDATE > I.DVDD OR F.EVENTDATE > I.MDD) 
    AND ((Trunc(F.EVENTDATE) - I.DVDD) > 2 OR (Trunc(F.EVENTDATE) - I.MDD) > 2) 
    AND I.FORMSTAGENAME IN ('Develop', 'Monitor') 
+0

:感謝您的答覆,是的,我忘記包括一個更多的加入條件,我把它包括在內,但我現在沒有得到任何記錄。 – palak 2012-05-02 12:11:29

+0

逐個刪除where子句限制(不是連接!),直到找到阻止返回任何記錄的限制爲止。 – Ollie 2012-05-02 12:16:40

+0

Ollie:我試過這種方式,當我刪除條件 - >((TRUNC(F.EVENTDATE)-I.DVDD)> 2或(TRUNC(F.EVENTDATE)-I.MDD)> 2)... I幾乎沒有記錄...你對這個有什麼想法嗎? – palak 2012-05-02 12:24:01