Самостоятельно присоединиться к 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
Примечание: в вашем тестовом случае нет отчетливости. Так что попробуйте с уникальным ключом.