清理使用子查询的查询

时间:2017-02-07 02:01:06

标签: sql-server

我有一个关于提高SQL Server查询效率的问题。

我有一个包含以下列的表

ID          int
ValueDate   datetime
Value       float

我想从值大于零的日期开始为每个ID选择行。这是我提出的SQL

SELECT a.ID, a.ValueDate, a.Value 
FROM MyTable a,
(SELECT ID, MIN(ValueDate) as VDate FROM MyTable WHERE Value > 0 GROUP BY ID) B
WHERE a.ID = b.ID and a.ValueDate >= b.VDate 

这有效,但我想知道是否还有另一种方法可以提高效率。我特别感兴趣的是查看其他表单,因为我需要用子查询替换单个表。我担心由于查询会有两次相同的子查询,这将减慢执行速度。无论如何都要调整查询,以便子查询只运行一次。这方面的问题是查询还需要在Oracle和Access数据库上运行,因此不能使用特定于SQL Server的内容,除非在其他两个数据库系统中存在替代等价物。

1 个答案:

答案 0 :(得分:0)

因此,我从冗余子查询中看到问题,正如我从您的描述中所理解的那样。例如,我们在表中有下一行:

SELECT [ID]
      ,[ValueDate]
      ,[Value]
  FROM [MyTable]

ID  ValueDate                Value
1   2017-06-02 12:14:55.000  0
1   2017-07-02 12:14:55.000  0,1
1   2017-08-02 12:14:55.000  0,2
2   2017-08-02 12:14:55.000  0,2

因此,您的查询会给出下一个结果:

ID  ValueDate                Value
1   2017-07-02 12:14:55.000  0,1
1   2017-08-02 12:14:55.000  0,2
2   2017-08-02 12:14:55.000  0,2 

它可以简化为SELECT a.ID, a.ValueDate, a.Value FROM MyTable a WHERE a.Value > 0,从而得到相同的结果。

您的子查询仅返回这些行以进行连接,那么使用它的原因是什么?我真的不明白你为什么要用它。