在postgresql中查询

时间:2012-06-20 07:45:38

标签: postgresql

我有两个表t1和t2如下
T1

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

我应该使用什么查询?

2 个答案:

答案 0 :(得分: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子句的select,添加了t2的行(否则它就像select * from t1)。如您所见,第一行包含NULLt2_a的{​​{1}}个:

t2_b

答案 1 :(得分:0)

怎么样:

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