2017-08-28 8 views
1
create table table_3 as  
select * 
from table_1 
    join table_2 on tbl.1.C1 = tbl.2.C1 
or tbl.1.C1 = tbl.2.C2 
or tbl.1.C1 = tbl.2.C3 
or tbl.1.C1 = tbl.2.C4 
or tbl.1.C1 = tbl.2.C5 
or tbl.1.C1 = tbl.2.C6 

表2には、チェックする必要がある合計10個の列があります。基本的には、テーブル2のcolumn1がヌルであるか、テーブル2のカラム2で不一致の場合はテーブル2の値を、テーブル2のカラム3ではヌルまたは不一致の場合はテーブル2の値をチェックしたいと考えています....次のクエリを合理化または高速化しようとしています。

+0

なぜあなたはそのクエリでやりたいのですか? – matekm

+0

私はtable_1にid #sのリストを持っていて、それらのid#は10個のtable_2の列のいずれかに入れることができます。一致した場合は、table_2から別のid_#を取り出す必要があります。 – user8528493

+0

ここでの構文は意味をなさない。ビューを作成しようとしていますか?構文が動作しないselectステートメントとしてテーブルを作成しようとしています。そして、クエリは混乱します。なぜなら、エイリアスが存在しないこととフォーマットが正しくないことを除いて、あなたが参照しているエイリアスの一種であるからです。 –

答えて

1

私は推測していますあなたの投稿がはっきりしていないので、あなたが何をしようとしているのかをここで確認してください。私はtable2の列のリストのANYがtable1の値と一致するときに結合したいと思う。これは、あなたのデザインでは何かがかなりかわいいが、クエリが簡単になるという大きなサインのようなものです。このようなもの。

select * 
from Table1 t1 
join Table2 t2 on t1.C1 in (t2.C1, t2.C2, t2.C3, t2.C4, t2.C5) 
2

私はあなたのクエリを理解している場合、あなたはそれを試すことができますことで、私は、知らない:

CREATE TABLE table_3 AS 
    SELECT COALESCE(B.c1, C.c2, D.c3, E.c4, F.c5, G.c6) 
    FROM table_1 A 
     LEFT JOIN table_2 B 
       ON A.c1 = B.c1 
     LEFT JOIN table_2 C 
       ON A.c1 = C.c2 
     LEFT JOIN table_2 D 
       ON A.c1 = D.c3 
     LEFT JOIN table_2 E 
       ON A.c1 = E.c4 
     LEFT JOIN table_2 F 
       ON A.c1 = F.c5 
     LEFT JOIN table_2 G 
       ON A.c1 = G.c6 

をこのコードでは最初のtable_2.c1の値を見つけてみてください、値を試しnullの場合、 .....

+0

「テーブル2のcolumn1がヌルまたは不一致の場合はテーブル2のテーブル2をチェックします。テーブル2のヌルまたは不一致の場合はテーブル2のcolumn2にチェックします2列3 .... " – xQbert

0

おそらくデータを正規化/ unpivotしてから参加しますか?

select * 
from table_1 t1 
join (Select c1 as cNorm, differentID_# from table_2 UNION ALL 
     Select c2, differentID_# from table_2 UNION ALL 
     Select c3, differentID_# from table_2 UNION ALL 
     Select c4, differentID_# from table_2 UNION ALL 
     Select c5, differentID_# from table_2 UNION ALL 
     Select c6, differentID_# from table_2 UNION ALL 
     Select c7, differentID_# from table_2 UNION ALL 
     Select c8, differentID_# from table_2 UNION ALL 
     Select c9, differentID_# from table_2 UNION ALL 
     Select c10, differentID_# from table_2) t2 
on t1.c1 = t2.cNorm 

これは任意の値に一致し、c1-c10からは進行しません。

+0

ありがとう。私のDBAと話をしました。実際には、もう1つのテーブルが回転していませんでした。 – user8528493

0

orjoinステートメントはパフォーマンスを低下させる可能性があります。実際に何をしたいのかは不明ですが、次のようにすれば最適な最適化プランを作成できます。

select * 
from table_2 t2 join 
    table_1 t1 
    on t1.C1 = t2.C1 
union all 
select * 
from table_2 t2 join 
    table_1 t1 
    on t1.c1 = t2.c2 and t1.c1 not in (t2.c1) 
union all 
select * 
from table_2 t2 join 
    table_1 t1 
    on t1.c1 = t2.c3 and t1.c1 not in (t2.c1, t2.c2) 
. . . 
関連する問題