【问题标题】:Translate MySQL join into SQL Server syntax?将 MySQL join 翻译成 SQL Server 语法?
【发布时间】:2012-01-05 11:51:13
【问题描述】:

在 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 语句?

【问题讨论】:

  • 你在ID之前多了一个括号我想...
  • 谢谢,但我想这并不意味着我可以在 SQL Server 中执行上述操作?我的印象是嵌套连接的整个语法不同?
  • ...除了table 是保留字,应该用方括号分隔,但我认为这只是一个例子
  • 它说“没有为'Something 1'的第2列指定列名,错误行实际上以红色显示为'LEFT JOIN',这让我觉得它不喜欢别名'Something1'
  • 没有列名意味着您需要将 MAX(Date) 设置为 MaxDate。此外,您还需要在其中包含一些日期逻辑,以便仅显示具有最大日期的记录。

标签: mysql sql sql-server


【解决方案1】:
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 中执行此操作的方式。它使“last/first/max/min/greatest-n-per group”变得容易。

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

使用它可以让你做一些花哨的事情,比如:

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

【讨论】:

  • 不一定应该,但可以,是的。不过,在我看来,这个问题更多的是关于你是否可以加入这样的子选择。
  • 你可以,但为什么会这样呢? :)
  • +1 用于敦促 OP 寻找替代方法而不是翻译。打个比方,与其将英语单词“Bring home the bacon”翻译成法语,不如寻找一个等价的成语,例如“Faire bouillir la marmite”(“让锅沸腾”)……或者让两者都说世界语(标准 SQL);)
【解决方案2】:

是的,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 列,因此您也可以省略它。无论如何,在这种特殊情况下,这似乎是两种产品之间的唯一区别。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 2021-02-14
    • 2019-02-23
    • 1970-01-01
    相关资源
    最近更新 更多