0

次のt1のように2つのテーブルt1とt2があります

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

私があなたを正しく理解しているなら、T2に対応する行がないT1の行が必要です。私の意見で最も簡単な方法は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の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)
于 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 に答える