2016-08-23 99 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