2017-03-07 70 views
0

有没有什么办法可以改善下面的查询?在sql查询中加入联合查询查杀性能

下面的查询给出了正确的结果,但是会影响性能。

+0

每个单独的查询是否也慢?你有ID列的索引吗?顺便说一句,我认为你需要使用PIVOT而不是写这样的查询。 – FLICKER

+0

您应该从ID开始,如果您不希望table1和table2之间有重复的ID,您可以用Union全部替换Union – NotCaring

+0

@ FLICKER:谢谢。我有一个ID的索引。是否可以通过枢轴。好心建议 –

回答

2

也许这样?

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 

猜测会更容易些,如果你提供的任何例子...

+2

也许切换到'union all'来避免重复数据删除? – SqlZim

+0

是的,这可能是可能的,当然取决于数据是什么 –

+0

是真的,但因为你正在汇总和使用'max()'无论如何... – SqlZim

0

你可以避开(),使用A.ID的加入,这可能会产生一些好处的性能

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