2013-07-19 7 views
0

A и B таблицы T3 такие же, как A и B, из T1. В основном мне нужно выбрать все значения, которые не находятся на T3. Если есть линия с A, B на T3, я не хочу ее показывать.Выберите строки, где некоторые значения не указаны в другой таблице

SELECT T1.A, T1.B, T1.C 
FROM T1, T2 
WHERE T1.X=T2.X 
AND NOT EXISTS 
(
    SELECT T3.A, T3.B 
    FROM T3 
) 

Любая помощь? Благодаря

+3

FYI: Конвенция в 'EXISTS' подзапрос должен выбрать некоторое фиксированное значение скалярного типа' И NOT EXISTS (SELECT 1 FROM table WHERE ... ", потому что неважно, какие записи возвращают подзапрос, просто независимо от того, вернет ли он записи вообще. Насколько я понимаю, столбцы SELECT в подзапросе существует фактически не b все равно, так что на самом деле не имеет значения, что вы используете с точки зрения производительности. Но, как правило, конвенция использует «SELECT 1». –

+0

Я не знаю, что для этого существует определенная конвенция - я всегда выбираю NULL, чтобы выразить отсутствие интереса ко всему, что возвращается. –

ответ

4
SELECT T1.A, T1.B, T1.C 
FROM T1 INNER JOIN T2 ON T1.X=T2.X 
WHERE NOT EXISTS 
(
    SELECT 1 FROM T3 
    WHERE T3.A = T1.A AND T3.B = T1.B 
) 
3
select T1.A,T1.B,T1.C 
from T1 
inner join T2 
on T1.X=T2.X 
left join T3 on T1.A=T3.A and T1.B=T3.B 
where T3.A is null 
+0

Я не думаю, что Oracle собирается сделать эффективное антисоединение с помощью этого метода, который он сделает для метода NOT EXISTS. –

0

Вы также можете сделать это с помощью подзапросов как

SELECT T1.A, T1.B, T1.C 
FROM T1, T2 
WHERE T1.X=T2.X 
AND T1.A NOT IN (SELECT T3.A FROM T3) 
AND T2.B Not IN (SELECT T3.B FROM T3) 
0
SELECT T1.A, T1.B, T1.C 
FROM T1, T2 
WHERE T1.X=T2.X 
AND (T1.A, T1.B) NOT IN (SELECT T3.A, T3.B FROM T3) 
Смежные вопросы