我有两个表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
我应该使用什么查询?
答案 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
)。如您所见,第一行包含NULL
和t2_a
的{{1}}个:
t2_b
答案 1 :(得分:0)
怎么样:
SELECT * FROM t1 WHERE (a,b) NOT IN (SELECT a,b FROM t2);