2016-08-23 45 views
-2

我使用下面的SQL語句查詢數據庫:提高SQL語句

SELECT 
ID, Date1, Date2, Value 
FROM 
data t1 
WHERE 
t1.ID = 100 AND Date2 BETWEEN '2010-01-01 00:00:00.0' AND '2010-01-31 23:59:59.0' AND t1.Date1 = 
(
    SELECT 
    max(t2.Date1) 
    FROM 
    data t2 
    WHERE 
    t2.Date1 <= '2010-02-01 00:00:00.0' AND t2.ID = t1.ID AND t2.Date2 = t1.Date2 
) 
ORDER BY 
t1.Date2 

我使用SELECT語句。有沒有更好的方法來改進SQL語句,或者通過使用JOIN來提高速度?

謝謝。

+3

標記您的問題與您正在使用的數據庫。而且,你確定日期的條件是正確的嗎?看起來很奇怪,條件是不同的。 –

+0

始終提供完整信息。 –

回答

0

這是使用cte和JOIN的方式。

;WITH cte_MaxDate 
AS (
     SELECT t2.ID,t2.Date2,MAX(t2.Date1) Maxdate1 
     FROM data t2 
     WHERE t2.Date1 <= '2010-02-01 00:00:00.0' 
     GROUP BY t2.ID,t2.Date2 
    ) 
SELECT t1.ID, Date1, t1.Date2, Value 
FROM data t1 
JOIN cte_MaxDate m ON t1.Date1 =m.Maxdate1 AND m.ID = t1.ID AND m.Date2 = t1.Date2 
WHERE t1.ID = 100 AND t1.Date2 BETWEEN '2010-01-01 00:00:00.0' AND '2010-01-31 23:59:59.0' 
+0

不幸的是,我試過這段代碼,但它沒有檢索到數據。 – grima

0

您可以使用加入這樣

SELECT 
ID, Date1, Date2, Value 
FROM 
data t1 
join (
    SELECT 
    max(t2.Date1) as tDate 
    FROM 
    data t2 
    WHERE 
    t2.Date1 <= '2010-02-01 00:00:00.0' AND t2.ID = t1.ID AND t2.Date2 = t1.Date2 
) A on t1.Date1 =A.tDate 
WHERE 
t1.ID = 100 AND Date2 BETWEEN '2010-01-01 00:00:00.0' AND '2010-01-31 23:59:59.0' 
ORDER BY 
t1.Date2 
+0

不幸的是,我試過這段代碼,但它沒有檢索到數據。 – grima

0

首先我建議不要使用CTE的請看以下鏈接查看爲什麼我說這句話的

https://dba.stackexchange.com/questions/13112/whats-the-difference-between-a-cte-and-a-temp-table

現在你可以使用這個

SELECT t2.ID,t2.Date2,MAX(t2.Date1) Maxdate1 into #Temp 
    FROM data t2 
    WHERE t2.Date1 <= '2010-02-01 00:00:00.0' 
    GROUP BY t2.ID,t2.Date2 

立即創建索引關於臨時表使用

Create Index T on #Temp (ID,Date2,Maxdate1) 

沒有使用這個

SELECT t1.ID, Date1, t1.Date2, Value 
FROM data t1 
    JOIN #Temp m ON t1.Date1 =m.Maxdate1 AND m.ID = t1.ID AND m.Date2 = t1.Date2 
WHERE t1.ID = 100 AND t1.Date2 BETWEEN '2010-01-01 00:00:00.0' AND '2010-01-31 23:59:59.0' 

請回復

+0

不幸的是,我試過這段代碼,但它沒有檢索到數據。 – grima