2013-11-21 123 views
0

下面的查詢在MySQL中成功執行,但在MSSQL中引發錯誤。任何人都可以爲我提供一個MSSQL 2008中等效查詢的例子嗎?MSSQL中的等效SQL查詢

SELECT DISTINCT TOP 20 
    [users].[id], [users].[email], [users].[first_name], [users].[last_name], 
    (SELECT groups_groups.name 
    FROM users AS groups_users 
    LEFT JOIN users_groups AS groups_users_groups ON groups_users_groups.user_id = groups_users.id 
    LEFT JOIN groups AS groups_groups ON groups_groups.id = groups_users_groups.group_id 
    WHERE users.id = groups_users_groups.user_id) AS [groups] 
FROM [users] GROUP BY [users].[id], [users].[email], [users].[first_name], [users].[last_name] 
ORDER BY [users].[id] DESC 

錯誤:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression 
+4

您收到什麼錯誤消息? – CloudyMarble

+2

我非常懷疑你的開頭語句的真實性 – Strawberry

+1

MySQL現在知道'TOP'了嗎? – DrCopyPaste

回答

0

也許你的問題可能是子查詢返回不止一個結果..嘗試

SELECT DISTINCT TOP 20 
    [users].[id], [users].[email], [users].[first_name], [users].[last_name], 
    (SELECT TOP 1 groups_groups.name 
    FROM users AS groups_users 
    LEFT JOIN users_groups AS groups_users_groups ON groups_users_groups.user_id = groups_users.id 
    LEFT JOIN groups AS groups_groups ON groups_groups.id = groups_users_groups.group_id 
    WHERE users.id = groups_users_groups.user_id) AS [groups] 
FROM [users] GROUP BY [users].[id], [users].[email], [users].[first_name], [users].[last_name] 
ORDER BY [users].[id] DESC 
+0

沒有錯誤,但錯誤的結果。 – wajatimur

+2

你沒有詢問結果..你問了關於錯誤..如果結果是錯誤的,那麼也許查詢是不正確的,爲試圖達到的邏輯..如果你告訴你真的想要什麼,也許我們可以重寫查詢.. – CaldasGSM

0

順便說一下,在MySQL中,子查詢可減少到...

SELECT DISTINCT g.name FROM groups_groups g 
+0

是的,對於mysql驅動程序,PDO按照建議提供查詢。 – wajatimur

1

SQL Server會返回該錯誤,因爲您的子查詢正在返回多個值,並且無法爲單個記錄中的用戶分配多個值。

我認爲你可以做到以下幾點:

  1. 審查你的子查詢的邏輯,爲了這樣它會返回僅僅只有每一個用戶記錄。
  2. 修復數據,以便您的子查詢將只返回一條記錄。
0
SELECT users.id as id ,groups_groups.name into #groups 
    FROM users AS groups_users 
    LEFT JOIN users_groups AS groups_users_groups 
     ON groups_users_groups.user_id = groups_users.id 
    LEFT JOIN groups AS groups_groups 
     ON groups_groups.id = groups_users_groups.group_id 
    WHERE users.id = groups_users_groups.user_id 

    SELECT DISTINCT TOP 20 
    [users].[id], [users].[email], [users].[first_name], [users].[last_name], g.name 
    FROM [users] 
    inner join #groups g on users.id=g.id 
    ORDER BY [users].[id] DESC 

這不是一個測試的代碼片段,但在疑問句看起來提到的,如果目的是獲取該用戶數據集的所有組(複製用戶數據,但新的組名稱查詢),並拋出錯誤作爲單個字段的子查詢返回多個值....如果上述情況是 所有user.id和groups.name基於加入所需的表,然後執行內部聯接到臨時表將所有用戶數據與基於ID的組名相結合應獲得所需的數據