2013-09-12 5 views
2

Использование SQL Server 2008Как добавить столбец, полученный из оператора select в выражении select?

Цель: Выберите серию колонок из table1 для вставки в table2

Выпуск: В table2 есть один дополнительный столбец, который должен быть вставлен, которые могут быть получены из соединение между table1 и таблицей 3

текущего кодом

SELECT 
    table1.name, 
    table1.email, 
    table1.phone, 
    CASE WHEN table1.status = 'active' THEN 1 ELSE 0 END AS Active, 
    CASE WHEN table1.group_id = 3 THEN 5 ELSE table1.group_id END AS RoleId, 
    (SELECT 
     table3.UserID AS ParentID 
    FROM 
     table3 
    INNER JOIN 
     table1 ON 
     table3.ID = table1.table3_ID) 
FROM 
    table1 
WHERE 
    table1.group_id = 3 AND 
    table1.status = 'active' 

В настоящее время этот код не работает и возвращает ошибку «Подзапрос возвратил более 1 значения». Я знаю, что это может быть неправильный способ использования вложенного выбора, что было бы правильным способом сделать это?

При необходимости могут быть предоставлены дополнительные данные. Спасибо заранее.

+0

Есть ли причина, по которой вы не можете присоединиться к таблице1 и таблице3 в своем предложении? –

+0

Спасибо, что все ответы были хорошими, тот, который я использовал, тот, который я проверил. Я бы проголосовал за всех, но у меня нет репутации –

+0

. Дополнительная информация по этой проблеме на случай, если кому-то интересно. Используя TOP-x, я смог понять, что в таблицу были введены дубликаты, вопрос. Быстрые COUNT и GROUP BY показали дублированные идентификаторы –

ответ

1

Проблема в том, что вы хотите получить коррелированный подзапрос. Это означает, что вам нужно удалить table1 из подзапроса:

SELECT table1.name, table1.email, table1.phone, 
     (CASE WHEN table1.status = 'active' THEN 1 ELSE 0 END) AS Active, 
     (CASE WHEN table1.group_id = 3 THEN 5 ELSE table1.group_id END) AS RoleId, 
     (SELECT table3.UserID 
     FROM table3 
     WHERE table3.ID = table1.table3_ID 
     ) as ParentID 
FROM table1 
WHERE table1.group_id = 3 AND table1.status = 'active'; 

Если есть больше чем один возможный матч в table3, то вам нужно что-то вроде select top 1 table3.UserId или select max(table3.UserId).

1

Если вы действительно (действительно действительно) хотите использовать subquery вместо join, ваш код будет достаточно. Вы должны изменить join вашего подзапроса, как показано ниже.

SELECT 
    table1.name, 
    table1.email, 
    table1.phone, 
    CASE WHEN table1.status = 'active' THEN 1 ELSE 0 END AS Active, 
    CASE WHEN table1.group_id = 3 THEN 5 ELSE table1.group_id END AS RoleId, 
    (SELECT 
     table3.UserID 
    FROM 
     table3 
    WHERE 
     table3.ID = table1.table3_ID) AS ParentID 
FROM 
    table1 
WHERE 
    table1.group_id = 3 AND 
    table1.status = 'active' 

Помимо этого я поставил псевдоним ParentID вне subquery.


Приведенный ниже код с псевдонимами таблиц. Хорошая практика - использовать его, потому что код более читабельен.

SELECT 
    t1.name, 
    t1.email, 
    t1.phone, 
    CASE WHEN t1.status = 'active' THEN 1 ELSE 0 END AS Active, 
    CASE WHEN t1.group_id = 3 THEN 5 ELSE t1.group_id END AS RoleId, 
    (SELECT 
     table3.UserID 
    FROM 
     table3 t3 
    WHERE 
     t3.ID = t1.table3_ID) AS ParentID 
FROM 
    table1 t1 
WHERE 
    t1.group_id = 3 AND 
    t1.status = 'active' 
1

Возможно, вы можете решить ошибку более 1 значения, добавив TOP 1 в раздел «выберите .. из таблицы» части выбора. Но им может быть проще просто присоединиться к ним.

SELECT 
table1.name, 
table1.email, 
table1.phone, 
CASE WHEN table1.status = 'active' THEN 1 ELSE 0 END AS Active, 
CASE WHEN table1.group_id = 3 THEN 5 ELSE table1.group_id END AS RoleId, 
table3.UserID 
FROM table1 
INNER JOIN table3 ON 
    table3.ID = table1.table3_ID 
WHERE 
table1.group_id = 3 AND 
table1.status = 'active' 
Смежные вопросы