2017-03-07 3 views
0

Gibt es eine Möglichkeit, die unten Abfrage zu verbessern?Join mit Union in SQL-Abfrage Tötung Leistung

Die folgende Abfrage gibt das richtige Ergebnis, aber die Leistung zu töten.

+0

Ist jede individuelle Abfrage auch langsam? Haben Sie einen Index für die ID-Spalte? BTW, ich denke, Sie müssen PIVOT verwenden, anstatt eine solche Abfrage zu schreiben. – FLICKER

+0

Sie sollten mit Indizes für die ID beginnen und wenn Sie keine doppelten IDs zwischen table1 und table2 erwarten, können Sie Union durch Union All ersetzen. – NotCaring

+0

@FLICKER: Danke. Ich habe einen Index für ID. Ist es möglich durch Pivot. schlagen Sie bitte vor, –

Antwort

2

Vielleicht so etwas?

Select 
    ID, 
    max(case when MYDATE = '20160105 10:00:00' then PRICE else 0 end), 
    max(case when MYDATE = '20140805 10:00:00' then PRICE else 0 end), 
    max(case when MYDATE = '20170215 10:00:00' then PRICE else 0 end) 
FROM 
(
    select ID, PRICE FROM TABLE1 WHERE MYDATE in ('20160105 10:00:00', '20140805 10:00:00', '20170215 10:00:00') 
    UNION ALL 
    SELECT ID, PRICE FROM TABLE2 WHERE MYDATE in ('20160105 10:00:00', '20140805 10:00:00', '20170215 10:00:00') 
) A 
group by ID 

Erraten wäre einfacher, wenn Sie Beispiele zur Verfügung gestellt hätte ...

+2

vielleicht zu "union all" zu wechseln, um die Deduplizierung zu vermeiden? – SqlZim

+0

Ja, das ist möglich, hängt natürlich davon ab, was die Daten sind –

+0

Wahr, aber da Sie aggregieren und 'max()' sowieso verwenden ... – SqlZim

0

Sie könnten ein() vermeiden, die A.ID verwenden für beitreten und dies könnte einen gewissen Nutzen für die Leistung produzieren

Select A.ID, A.[2016 Price], B.[2014 Price], C.[2017 Price] 
FROM 

    (
    select ID, PRICE [2016 Price] FROM TABLE1 WHERE MYDATE = 2016-01-05 10:00:00 
    UNION 
    SELECT ID, PRICE FROM TABLE2 WHERE MYDATE = 2016-01-05 10:00:00 
) A 

INNER JOIN 

    (
    select ID, PRICE [2014 Price] FROM TABLE1 WHERE MYDATE = 2014-08-05 10:00:00 
    UNION 
    SELECT ID, PRICE FROM TABLE2 WHERE MYDATE = 2014-08-05 10:00:00 
) B ON A.ID =B.ID 

INNER JOIN 

    (
    select ID, PRICE [2017 Price] FROM TABLE1 WHERE MYDATE = 2017-02-15 10:00:00 
    UNION 
    SELECT ID, PRICE FROM TABLE2 WHERE MYDATE = 2017-02-15 10:00:00 
) ON A.ID =C.ID