Sql server 清理使用子查询的查询
我有一个关于提高SQL Server查询效率的问题 我有一个包含以下列的表Sql server 清理使用子查询的查询,sql-server,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
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的任何东西,除非在其他两个数据库系统中存在等效的东西作为替代品。因此,正如我从您的描述中理解的那样,我看到了冗余子查询中的问题。例如,表中有下一行:
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
它可以简化为从MyTable a中选择a.ID、a.ValueDate、a.Value,其中a.Value>0
,从而得到相同的结果
您的子查询只为join返回这些行,那么使用它的原因是什么?我真的不明白你为什么要用它。ID不是唯一的吗?我不清楚为什么要使用
组
为什么不简单地使用从MyTable a中选择a.ID、a.ValueDate、a.Value,其中a.Value>0
?anatol---ID和date列构成唯一键。我使用GROUP BY是因为我想从第一个非零值开始收集数据,但是如果在那之后有零值,我需要保留它。这是时间序列数据。每月一次。对于绘制数据的清洁度,我想从第一个非零值的月份开始。但在那之后,我每个月都需要,即使是那些值为零的。因此,用于查找起始月份的子查询是具有非零值的第一个月份。