2012-01-05 79 views
0

在MySQL中我曾經是能夠做一些事情,如:將MySQL連接轉換爲SQL Server語法?

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 

所以我試圖做的就是給我最近averagevalue,每個ID

在SQL Server中的語法似乎是不同的,不允許我做嵌套的SELECT語句?

+1

你在'ID'之前有一個額外的支架我認爲... – 2012-01-05 11:54:02

+0

謝謝,但我認爲,這並不意味着我可以在SQL Server中做到以上幾點?給我的印象是嵌套連接的整個語法是不同的? – mezamorphic 2012-01-05 11:55:06

+0

@ user1107474:爲什麼不試試呢?它應該運行得非常好。 – 2012-01-05 11:56:10

回答

2
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中執行此操作的方式。它使得「最後/第一/最大/最小/最大 - 每組」最簡單。這裏

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

不一定*應該*,但是*可以*,是的。但是,這個問題在我看來更多的是關於你是否可以加入這樣的子查詢 – 2012-01-05 12:01:41

+0

你可以,但爲什麼會這樣?:) – cairnz 2012-01-05 12:05:18

+1

+1促使OP到LO好的替代方法,而不是翻譯。用一個比喻,而不是將英語單詞「把培根帶回家」翻譯成法語,而應該尋找一個等同的習語,例如「Faire bouillir la marmite」(「保持鍋沸騰」)......或者讓兩者都說世界語(Standard SQL);) – onedaywhen 2012-01-05 12:48:29

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 

既然你不拉你的主要選擇的MaxDate列,你也只是忽略它。無論如何,這似乎是這兩種產品在這種特殊情況下的唯一區別。