2013-11-21 4 views
0

Ниже запрос был успешно выполнен в MySQL, но ошибка MSSQL. Может ли кто-нибудь предоставить мне пример эквивалентного запроса в MSSQL 2008?Эквивалентный SQL-запрос в MSSQL

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

вы не спрашивали о результате .. вы спросили об ошибке. Если результат неверен, то, возможно, запрос неверен, для логики, которая пыталась достичь. Если вы скажете, что вы действительно хотите, возможно, мы сможем переписать query .. – 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 

это не испытанный фрагмент кода, хотя из запроса, указанного в Ques он выглядит, если цель состояла в том, чтобы получить все группы для этого набора пользовательских данных (дублирование пользовательских данных, но и новые имена групп) и метали ошибку, так как подпроцесс для одного поля возвращал несколько значений .... если приведенный выше сценарий - это случай , который получает все user.id и groups.name в таблицу temp на основе объединения необходимых таблиц, а затем делает внутреннее соединение с объединить все пользовательские данные с именами групп на основе идентификатора должны получить требуемые данные

Смежные вопросы