Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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
将MySQL连接转换为SQL Server语法?_Mysql_Sql_Sql Server - Fatal编程技术网

将MySQL连接转换为SQL Server语法?

将MySQL连接转换为SQL Server语法?,mysql,sql,sql-server,Mysql,Sql,Sql Server,在MySQL中,我曾经能够执行以下操作: SELECT Something1.ID, Something2.AverageValue FROM (SELECT ID, Max(Date) FROM Table GROUP BY ID) Something1 LEFT JOIN (SELECT ID, AverageValue FROM Table) Something2 ON Something1.ID = Something2.ID 所以我想做的是给我每个ID最近的平均值 SQL Serve

在MySQL中,我曾经能够执行以下操作:

SELECT Something1.ID, Something2.AverageValue FROM
(SELECT ID, Max(Date) FROM Table GROUP BY ID) Something1
LEFT JOIN
(SELECT ID, AverageValue FROM Table) Something2
ON Something1.ID = Something2.ID
所以我想做的是给我每个ID最近的平均值

SQL Server中的语法似乎不同,不允许我执行嵌套的SELECT语句

WITH Data AS
(
 SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date DESC) AS Row_Number,
 ID,
 AverageValue
 FROM Table
)
SELECT * FROM Data WHERE Row_Number = 1
这是在SQL Server中应该使用的方法。它使每组的最后一个/第一个/最大/最小/最大-n-像馅饼一样简单

这里的PARTITION BY关键字等于GROUP BY语句,这里的ORDER BY将转换为您在MySQL中使用的MAX AGGRATE函数

使用它可以让您完成一些奇特的工作,如:

WITH Data AS
    (
     SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date DESC) AS Row_Number,
     ID,
     AverageValue
     FROM Table
    )

SELECT Newest.ID, 
Newest.AverageValue, 
(Newest.AverageValue - Next_Newest.AverageValue) AS AverageValue_Change,
Newest.Date
 FROM Data Newest
LEFT OUTER JOIN Data Next_Newest 
 ON Newest.Row_Number+1 = Next_Newest.Row_Number
AND Newest.ID = Next_Newest.ID 

WHERE Newest.Row_Number=1
这是在SQL Server中应该使用的方法。它使每组的最后一个/第一个/最大/最小/最大-n-像馅饼一样简单

这里的PARTITION BY关键字等于GROUP BY语句,这里的ORDER BY将转换为您在MySQL中使用的MAX AGGRATE函数

使用它可以让您完成一些奇特的工作,如:

WITH Data AS
    (
     SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date DESC) AS Row_Number,
     ID,
     AverageValue
     FROM Table
    )

SELECT Newest.ID, 
Newest.AverageValue, 
(Newest.AverageValue - Next_Newest.AverageValue) AS AverageValue_Change,
Newest.Date
 FROM Data Newest
LEFT OUTER JOIN Data Next_Newest 
 ON Newest.Row_Number+1 = Next_Newest.Row_Number
AND Newest.ID = Next_Newest.ID 

WHERE Newest.Row_Number=1
是的,SQL Server中的此查询存在问题,您的评论有助于了解这一点

MySQL似乎可以将列表示为表达式,而不使用别名。这是SQL Server中的“不行”。如果SELECT子句中的列是表达式,则必须为其提供别名。因此:

SELECT Something1.ID, Something2.AverageValue FROM
(SELECT ID, Max(Date) AS MaxDate FROM Table GROUP BY ID) Something1
LEFT JOIN
(SELECT ID, AverageValue FROM Table) Something2
ON Something1.ID = Something2.ID
由于您没有在主SELECT中提取MaxDate列,因此也可以省略它。无论如何,在这种特殊情况下,这似乎是这两种产品之间的唯一区别。

是的,正如您的评论所示,SQL Server中的此查询存在问题

MySQL似乎可以将列表示为表达式,而不使用别名。这是SQL Server中的“不行”。如果SELECT子句中的列是表达式,则必须为其提供别名。因此:

SELECT Something1.ID, Something2.AverageValue FROM
(SELECT ID, Max(Date) AS MaxDate FROM Table GROUP BY ID) Something1
LEFT JOIN
(SELECT ID, AverageValue FROM Table) Something2
ON Something1.ID = Something2.ID

由于您没有在主SELECT中提取MaxDate列,因此也可以省略它。无论如何,这似乎是这两种产品在这种特殊情况下的唯一区别。

我想在ID之前还有一个额外的括号……谢谢,但我想这并不意味着我可以在SQL Server中完成上述操作?给我的印象是嵌套联接的整个语法是不同的?…除了表是保留字并且应该用方括号分隔之外,但我认为这只是一个例子,它说没有为“Something 1”的第2列指定列名,错误行实际上以红色显示为“LEFT JOIN”,这让我觉得它不喜欢别名“Something 1”没有列名意味着需要将MAXDate设置为MAXDate。您还需要在其中包含一些日期逻辑,以便只显示具有最大日期的记录。您在ID之前有一个额外的括号,我想…谢谢,但我想这并不意味着我可以在SQL Server中执行上述操作?给我的印象是嵌套联接的整个语法是不同的?…除了表是保留字并且应该用方括号分隔之外,但我认为这只是一个例子,它说没有为“Something 1”的第2列指定列名,错误行实际上以红色显示为“LEFT JOIN”,这让我觉得它不喜欢别名“Something 1”没有列名意味着需要将MAXDate设置为MAXDate。此外,您还需要有一些日期逻辑,以便只显示具有最大日期的记录。不一定应该,但可以,是的。不过,在我看来,这个问题更多的是关于你是否可以像那样加入Subselect。你可以,但为什么这样做呢+1敦促OP寻找替代方法,而不是翻译。用一个比喻,而不是翻译英语单词,把培根带回家换成法语,你应该找出一个等价的成语,例如:Faire bouillir la marmite Keep the pot沸腾。。。或者让两者都说世界语标准SQL;不一定应该,但可以,是的。不过,在我看来,这个问题更多的是关于你是否可以像那样加入Subselect。你可以,但为什么这样做呢+1敦促OP寻找替代方法,而不是翻译。用一个比喻,而不是翻译英语单词,把培根带回家换成法语,你应该找出一个等价的成语,例如:Faire bouillir la marmite Keep the pot沸腾。。。或者让两者都说世界语标准SQL;