【问题标题】:Self Join Oracle自加入 Oracle
【发布时间】:2014-06-24 15:25:38
【问题描述】:

我有一个表table1下面是数据的样子。

Column1 是我另一个表的外键。

    Column1 Column2 Column3
    1       A       06/MAY/14
    1       A       05/MAY/14
    1       B       06/MAY/14
    1       B       01/JAN/00
    1       A       01/JAN/00

现在我想找到满足以下条件的不同 column1 值。

1.atleast 一条记录,其中 column2 应为 A,column3 应为 (sysdate - 1)

2.atleast 一条记录,其中 column2 应为 B,column3 应为 (sysdate - 1)

意思是 A 和 B 的第 3 列应填充 (sysdate - 1)

我已经写了下面的查询,如果我做错了什么,请告诉我。

我也想知道我的加入方式是否正确。该表包含大约 50K 条记录,我猜性能应该没问题。

    SELECT DISTINCT COLUMN1 FROM 
    TABLE1 A
    JOIN 
    TABLE1 B ON (A.COLUMN1 = B.COLUMN1)
    WHERE
    ((TRUNC(A.COLUMN3) - TRUNC(A.COLUMN3) = 0)
    AND TRUNC(A.COLUMN3) = TRUNC(SYSDATE - 1)
    AND TRUNC(B.COLUMN3) = TRUNC(SYSDATE - 1)
    AND A.COLUMN2 = 'A'
    AND B.COLUMN2 = 'B'
    AND TO_CHAR(A.COLUMN3, 'DD-MON-YY') != '01-JAN-00'
    AND TO_CHAR(B.COLUMN3, 'DD-MON-YY') != '01-JAN-00'
    );

【问题讨论】:

    标签: oracle self-join


    【解决方案1】:

    对于带有子选择和组的性能比较:

    SELECT COLUMN1 FROM (
        SELECT 
            COLUMN1, 
            COUNT(COLUMN2) CNT 
        FROM (
            SELECT DISTINCT
                COLUMN1,
                COLUMN2
            FROM TABLE1 
            WHERE TRUNCATE(COLUMN3) = SYSDATE - 1 AND
                (COLUMN2 = 'A' OR COLUMN2 = 'B')) 
        GOUP BY COLUMN1)
    WHERE CNT = 2
    

    【讨论】:

      【解决方案2】:

      这应该可以工作

      SELECT DISTINCT A.column1            -- Obtain distinct from A
      FROM   table1 A                      -- TableA
             join table1 B                 -- TableB
               ON A.column1 = B.column1    -- Joining them on Column1 
      WHERE  A.column3 = SYSDATE - 1       -- Yesterdays data on Table A
             AND A.column2 = 'A'           -- A values
             AND B.column2 = 'B';          -- B Values
      

      注意:您的测试用例没有区别。因此,请尝试使用唯一键。

      【讨论】:

      • AND B.column3 = SYSDATE - 1 不是必需的。 A.column3 = SYSDATE - 1 应该注意这一点。 AB 是同一张表。
      • 哦,是的。非常感谢。忘记了
      • 谢谢,你能告诉我为什么当所有包含 column3 的行都为 '01/JAN/00' 时,下面的语句没有返回任何行。 select distinct column1, max(column3) over (partition by column1) as stmt from table1 where column1 in (1)
      • simple... 2000 年 1 月不是昨天。您说您只需要 sysdate -1 (昨天),如果您不知道它是什么,请不要使用 max over parition... 请先阅读手册
      • 但我在上述查询中没有任何 where 子句说明 sysdate -1。 where 子句仅是 (1) 中的第 1 列。
      猜你喜欢
      • 1970-01-01
      • 2021-02-23
      • 2020-07-16
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 2015-06-05
      相关资源
      最近更新 更多