2012-05-10 8 views
1

初心者の質問。私はなるだろう一致する列を選択してください

c1|c2|c3 
1 | a|v3 
2 | b|v4 
2 | c|v5 
3 | d|v6 

c1|c2|c3 
1 | a|v1 
2 | b|v2 
2 | c|v5 

誰もが知っている

c1|c2|c3 
1 | a|v1 
2 | b|v2 

とt2:私はT1を持っている場合はそう

SELECT c1,c2,c3 FROM TABLE t1 
UNION 
SELECT c1,c2,c3 FROM TABLE t2 WHERE t1.c1 IS NOT NULL AND t1.c2 IS NULL; 

:私のような何かをしたいですこれを行う方法?

+0

私は左がC1ないT1で、例えば持つ行が含まれることになる参加してもらうことができる最高の3 | d | v6、またはt1にないc2を持つ行を除外するより厳しい条件の左結合。 2 | c | v5 – NotGaeL

+1

下記の私の答えを見てください。私はそれを試してみたsqlのフィドルhttp://sqlfiddle.com/#!2/dc795/7 –

答えて

2

SQLドキュメント、JOINによる速いことSubQueriesです。この方法を試してください。

SELECT c1, c2, c3 
FROM t1 
UNION 
SELECT b.c1, b.c2, b.c3 
FROM t1 a inner join t2 b ON 
     (a.c1 = b.c1) and (a.c1 = b.c1) 
WHERE (b.c1,b.c2) NOT IN (SELECT c1,c2 FROM t1) 

を証明するために、ここを参照してください:http://sqlfiddle.com/#!2/50a4e/23

+0

あなたの答えは正しいですが、それでも私のテーブルでは機能せず、理由はわかりません。何が起こるかは、両方のテーブルで同じc1とc2を持つ値を繰り返すため、結果は です。c1 | c2 | c3 1 | a | v1 2 | b | v2 2 | c | v5 1 | a | v3 2 | b | v4 ちょうどの代わりに: c1 | c2 | c3 1 | a | v1 2 | b | v2 2 | c | v5 – NotGaeL

+0

あなたのテーブルのデータがあなたの例と同じではないからです。 –

+0

私はあなたのフィドル(http://sqlfiddle.com/#!2/50a4e/1)の各テーブルに1つの値を加えて問題を再現しました。行| c1 | c2)= | 1 | 'b'を見ることができます。値v1.2とv3.2で繰り返されます。 | 1 | 'b' | v1.2 |はt1からの1行だけでなければなりません。行| 1 | 'a'の場合も同様です。 t1とt2から。 – NotGaeL

2

クエリは以下のようになります。しかし、私はそれがいかに効率的であるかわかりません。

SELECT 
    T1.c1, 
    T1.c2, 
    T1.c3 
FROM T1 
UNION  
SELECT 
    T2.c1, 
    T2.c2, 
    T2.c3 
FROM T2 
WHERE ((T2.c1,T2.c2) NOT IN (SELECT t1.c1,t1.c2 FROM t1)) AND 
(T2.c1 IN (SELECT t1.c1 FROM t1)) 
+0

いいえ。このクエリでは、c2の値がt2の異なるc1に対して繰り返される場合、最初のc1に対してのみ選択されます。私はt1からの選択に結合したいと思います。すべてのカップルc1、c2をt2から選択します。ここで、c1はt1からの選択にありますが、(c1、c2)はそうではなく、c2ではありません。 – NotGaeL

+0

(私はちょうどそれを修正したので、今は有効な解決策ですが、依然として効率的ではありません) – NotGaeL

0
select t2.c1,t2.c2,t2.c3 
from t1,t2 
where t1.c1=t2.c2; 
関連する問題