2017-01-11 2 views
2

Ich habe eine Abfrage:SQL-Abfrage-Optimierung beitreten Union unterschiedliche

Select A.col1 as col1, B.col5 as col2, C.col10 as col3 
    FROM Table A 
    JOIN Table B on(A.col2 = B.col2) 
    JOIN table C on(C.col1 = B.col3) 
UNION 
SELECT A.col1 as col1, B.col5 as col2, NULL as col3 
    FROM Table A 
    JOIN Table B on (A.col2 = B. col2) 
      where A.col4 != 'somevalue' 

eine Möglichkeit, dies zu machen schneller ??

Table A 
-------- 
col1   col2   col4 
gerry   1   'somevalue' 
harry   2   'othervalue' 
tom   3   
sarah   4   'somevalue' 

col2 of table A is the primary key 

Table B 
------- 
col2   col3 col5 
1   45  34 
1   34  23 
1   56  67 
2   34  56 
Primary key of B is (col2, col3) 
Table C 
------- 
col1  col10 
34  'heyya' 
467  'tyga' 
56  'pity' 

Primärschlüssel von C ist auch zusammengesetzt. eine dieser Tasten ist spalte1

Output: 
col1  col2 col3 
gerry 23  'heyya' 
gerry 67  'pity' 
gerry 34  NULL 
harry  56  'heyya' 

So Werte von B, die in Gegenwart oder C haben ‚somevalue‘ in A haben, werden genannt. Es werden auch Werte mit beiden aufgerufen.

+0

warum wollen Sie eine Zeile zweimal haben (nur col3 ist anders)? –

+0

Ich stimme zu, dass eine Zeile zweimal kommt. Ich kann nicht herausfinden, es zu beseitigen. Die Abfrage wurde zuerst durch die Vereinigung von zwei separaten Abfragen, die bereits existierten und sinnvoll gemacht, aber jetzt sehe ich das und versuche zu optimieren und kann keinen Weg finden –

+0

liefern Rohdaten und expacted Ergebnis bitte – Alex

Antwort

1

ist das OK für Sie? so erhalten Sie alle Zeilen und wenn A.col4 <> ‚somevalue‘ dann Sie für col3 NULL erhalten

Select 
     A.col1 as col1 
    , B.col5 as col2 
    , C.col10 as col3 
    , if(A.col4 != 'somevalue', 1, 0) as col4 
FROM Table A 
JOIN Table B on(A.col2 = B.col2) 
    JOIN table C on(C.col1 = A.col3); 
+0

Vielen Dank .. Ich denke, ich habe jetzt ein paar Ides .. Danke wirklich zu schätzen –

+0

Das einzige Problem mit dieser Lösung ist, wie man diese Werte von B erhalten, die nicht in C existiert aber 'jemand anders' in A. Ich habe einige Details der Daten beigefügt –

+0

Ich habe meine Antwort ändern. Jetzt haben Sie col1 bis col3 und in col4 erhalten Sie eine Flagge 1 oder 0 wenn A.col4! = 'somevalue'. –