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