2017-01-31 5 views
1

3つのテーブルからデータを選択する必要があります。第1テーブルと第2テーブルの間でINNER JOINを使用して2番目のテーブルから別のフィールドを取得しています。しかし、一致がない場合、私は別の第一のテーブルfield.Iは、以下のクエリを使用していて、それを交換する必要がありますが、それはそれをユニオンオペレータの代わり

SELECT tba.field, tba.field1, tba.field2 AS test FROM tablea tba 
    WHERE tba.field NOT IN (SELECT ta.field FROM tablea ta INNER JOIN tableb tb ON ta.field = tb.field) 
UNION 
SELECT ta.field, ta.field1, tb.field2 AS test FROM tablea ta 
    INNER JOIN tableb tb ON ta.field = tb.field 
UNION 
SELECT tc.field, tc.field1, tc.field2 AS test FROM tablec tc 

SQL fiddle

+4

がhttp://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-を参照してください。私にとっては非常にシンプルなSQLクエリですが、クエリのパフォーマンスに関する質問では、少なくとも関連するすべてのテーブルのSHOW CREATE TABLEステートメントとEXPLAIN。 – Strawberry

+0

not inでサブクエリを使用していて、unionで2番目のクエリが同じです。どうして ? –

+0

@strawberry私はリンクを追加しました。 – khalil

答えて

0

何かで十分です:

SELECT tba.field, tba.field1, COALESCE(tb.field2, tba.field2) AS test 
FROM tablea tba 
LEFT OUTER JOIN tableb tb ON tba.field = tb.field 
UNION 
SELECT tc.field, tc.field1, tc.field2 AS test FROM tablec tc 
0
を行うための別の方法がありprocess.Isに時間がかかりすぎます

お試しください:ここではクエリ1の代替方法があり、データが重複していない場合はUNIONの代わりにUNION ALLを使用することもできます。 UNION ALLが比較的高速である。このような

SELECT ta.field1, ta.field2, IFNULL(tb.field2, ta.field3) AS mytest 
FROM tablea ta 
LEFT JOIN tableb tb ON ta.field3 = tb.field1 
UNION ALL 
SELECT tc.field1, tc.field2, tc.field3 AS mytest FROM tablec tc