2012-06-20 122 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 

這裏A,B,C,d,E是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) 

編輯:這裏的選擇沒有where子句,從加T2的行(否則它會成爲像一個select * from t1)。正如你可以看到,第一行包含NULL S表示t2_at2_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

它不返回任何行:(是U確保查詢工作正常u能知道?如何執行此查詢? – suraj

+0

上面的粘貼來自實際的psql會話,所以它肯定適用於您提供的測試數據。如果第二個表不包含匹配,則左外連接將添加NULL而不是真實數據行(基於'ON(t1.a = t2.a和t1.b = t2.b)'條件)。 – mitchnull

+0

請原諒我。 ctually。如果沒有「t2.a is null」約束,您可以在左外連接之後顯示輸出嗎?我試圖瞭解這個查詢。 – suraj

0

如何:

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

請檢查我接受的答案。這很完美! – suraj