我有一个关于提高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的内容,除非在其他两个数据库系统中存在替代等价物。
答案 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
,从而得到相同的结果。
您的子查询仅返回这些行以进行连接,那么使用它的原因是什么?我真的不明白你为什么要用它。