Самостоятельно присоединиться к Oracle

У меня есть таблица 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)

Я написал запрос ниже, пожалуйста, скажите, если я делаю что-то не так.

Я также хочу знать, правильно ли я поступаю. Таблица содержит около 50К записей, и производительность должна быть хорошей, я думаю.

    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 ответа

Для сравнения производительности с подвыборками и группой:

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

Это должно работать

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

Примечание: в вашем тестовом случае нет отчетливости. Так что попробуйте с уникальным ключом.

Другие вопросы по тегам