0

我有两个表 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

我应该使用什么查询?

4

2 回答 2

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 的行(否则它就像 a select * from t1)。如您所见,第一行包含NULLst2_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)
于 2012-06-20T07:57:33.407 回答
0

怎么样:

SELECT * FROM t1 WHERE (a,b) NOT IN (SELECT a,b FROM t2);
于 2012-06-20T09:24:13.097 回答