自我加入Oracle

时间:2014-05-07 15:01:16

标签: oracle self-join

我在下面有一个表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.至少一个记录,其中column2应为A,column3应为(sysdate - 1)

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

含义alteast one 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'
    );

2 个答案:

答案 0 :(得分:0)

这应该有效

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

注意:您的测试用例没有明显性。所以尝试使用一个独特的密钥。

答案 1 :(得分:0)

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

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