Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 清理使用子查询的查询_Sql Server - Fatal编程技术网

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

我有一个关于提高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的任何东西,除非在其他两个数据库系统中存在等效的东西作为替代品。

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

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是因为我想从第一个非零值开始收集数据,但是如果在那之后有零值,我需要保留它。这是时间序列数据。每月一次。对于绘制数据的清洁度,我想从第一个非零值的月份开始。但在那之后,我每个月都需要,即使是那些值为零的。因此,用于查找起始月份的子查询是具有非零值的第一个月份。