2012-06-20 4 views
0

меня есть две таблицы t1 и t2 следующим образом

t1запросов в PostgreSQL

A B C D E 
1 2 c d e 
3 1 d e f 
4 2 f g h 

t2

A B  
1 2  
8 6 
4 2 

Здесь А, В, С, D, Е являются столбцы t1 и A, B являются столбцами t2, где A и B являются общими столбцами.
То, что я сделал до сих пор
Я написал следующий запрос

WITH temp as (
    select * 
    from t2 
) 
select tab1.* 
from t1 tab1, temp tab2 
where (tab1.A!=tab2.A OR tab1.B!=tab2.B) 

Я хотел этот выход

A B C D E 
3 1 d e f 

Но я получаю этот выход

A B C D E 
1 2 c d e 
1 2 c d e 
3 1 d e f 
3 1 d e f 
3 1 d e f 
4 2 f g h 
4 2 f g h 

Какой запрос следует использовать?

ответ

3

Если вы правильно поняли, вам нужны эти строки из T1, у которых нет соответствующих строк в T2. Самый простой способ, на мой взгляд является LEFT OUTER JOIN:

psql=> select * from t1; 
a | b | c | d | e 
---+---+---+---+--- 
1 | 2 | c | d | e 
3 | 1 | d | e | f 
4 | 2 | f | g | h 
(3 rows) 

psql=> select * from t2; 
a | b 
---+--- 
1 | 2 
8 | 6 
4 | 2 
(3 rows) 

psql=> select t1.a, t1.b, t1.c, t1.d, t1.e from t1 left outer join t2 on (t1.a = t2.a and t1.b = t2.b) where t2.a is null; 
a | b | c | d | e 
---+---+---+---+--- 
3 | 1 | d | e | f 
(1 row) 

Edit: Вот выбор без ИНЕКЕ, с рядами от t2 добавленной стоимости (в противном случае было бы так же, как select * from t1). Как вы можете видеть, первая строка содержит NULL с для t2_a и t2_b:

psql=> select t1.a, t1.b, t1.c, t1.d, t1.e, t2.a as t2_a, t2.b as t2_b from t1 left outer join t2 on (t1.a = t2.a and t1.b = t2.b); 
a | b | c | d | e | t2_a | t2_b 
---+---+---+---+---+------+------ 
3 | 1 | d | e | f |  |  
1 | 2 | c | d | e | 1 | 2 
4 | 2 | f | g | h | 4 | 2 
(3 rows) 
+0

Она не возвращает никаких строк :(Есть у уверены, что запрос работает нормально Можно сказать, у? как этот запрос будет выполнен? – suraj

+0

Паста выше - это фактический сеанс psql, поэтому он определенно работает для тестовых данных, которые вы предоставили. Левое внешнее соединение добавит NULL вместо реальных данных, если вторая таблица не содержит соответствующих строка (на основе условия 'ON (t1.a = t2.a и t1.b = t2.b)'). – mitchnull

+0

Простите меня. ctually. Можно ли, пожалуйста, показать результат после левого внешнего соединения без ограничения «t2.a является нулевым»? Я пытаюсь понять запрос. – suraj

0

Как о:

SELECT * FROM t1 WHERE (a,b) NOT IN (SELECT a,b FROM t2); 
+0

, пожалуйста, проверьте ответ, который я принял. Это прекрасно работает !!!! – suraj

Смежные вопросы