簡體   English   中英

將MySQL聯接翻譯成SQL Server語法?

[英]Translate MySQL join into SQL Server syntax?

在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聚合函數

使用它可以使您做一些花哨的事情,例如:

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列,因此也可以忽略它。 無論如何,在這種特殊情況下,這似乎是兩種產品之間的唯一區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM