-2

以下は、結果に対する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' ) 
4

2 に答える 2

2

リスト内の他のテーブルにリンクTABLE4(別名)していないため、デカルト積が作成されます。Lこれにより、重複レコードが生成される可能性があります。
他のテーブルの1つに参加TABLE4すると、準備が整います。

http://docs.oracle.com/cd/B14117_01/server.101/b10759/queries006.htmのデカルト積を参照してください。

これは、古いSQL-96よりもSQL-92構文を使用する良い理由でもあります。テーブル結合を明示的に指定する必要があります。
SQL-92を使用してクエリを書き直しました。表4の結合条件を挿入するだけで、うまくいくはずです。

それが役に立てば幸い...

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' ) 
于 2012-04-27T14:00:53.110 に答える
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
于 2012-04-27T14:00:03.863 に答える