【问题标题】:Getting duplicates in my oracle select query在我的 oracle 选择查询中获取重复项
【发布时间】:2012-04-26 05:14:04
【问题描述】:

以下是我对结果的 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' ) 

【问题讨论】:

    标签: sql oracle oracle10g


    【解决方案1】:

    您没有将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' ) 
    

    【讨论】:

    • :感谢回复,是的,我忘了再包含一个加入条件,我已经包含了,但我现在没有任何记录。
    • 一一删除 where 子句限制(不是连接!),直到找到阻止返回任何记录的限制。
    • Ollie:我试过这样,当我删除条件时->((TRUNC(F.EVENTDATE)-I.DVDD) >2 OR (TRUNC(F.EVENTDATE)-I.MDD) >2 )...我的记录很少...您对此有什么想法吗?
    • @palak,恐怕调查将取决于您,这完全取决于您的数据,因此我无法帮助您进行调查。对不起:-(
    【解决方案2】:

    我对此类信息所做的最好的事情就是告诉您对整个查询进行分组:

       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
    

    【讨论】:

    • OP 的 SQL 中有一个笛卡尔积导致重复行。
    猜你喜欢
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 2013-04-03
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多