【问题标题】:Improve SQL statement改进 SQL 语句
【发布时间】:2016-08-23 06:03:11
【问题描述】:

我正在使用以下 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 使其更快?

谢谢。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。而且,你确定日期的条件是正确的吗?条件不同似乎很奇怪。
  • 始终提供完整信息。

标签: sql performance select join


【解决方案1】:

这里是使用 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' 

【讨论】:

  • 不幸的是,我尝试了这段代码,但它没有检索到数据。
【解决方案2】:

你可以像这样使用join

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

【讨论】:

  • 不幸的是,我尝试了这段代码,但它没有检索到数据。
【解决方案3】:

首先我建议不要使用 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' 

请回复

【讨论】:

  • 不幸的是,我尝试了这段代码,但它没有检索到数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多