2013-11-08 4 views
-1

Я следующий код -Неоднозначное имя столбца 'CustomerId'

declare @userType int 
declare @custIdOfUser int 

select 
    @userType = UserTypeId, @custIdOfUser = CustomerId 
from 
    customers c with (nolock) 
left outer join 
    Sites s with (nolock) on c.CustomerId = s.CustomerId 
left outer join 
    customers rc on rc.CustomerId = c.ResellerId 
where 
    c.[name] is not null 
    and (c.customerId is null or rc.CustomerId = c.CustomerId) 
    and c.IsActive != '' 
    and (@userType = 1 OR @userType = 2 OR 
      (c.customerId in ((SELECT u.CustomerId, ur.RoleId 
           FROM Users u 
           INNER JOIN UserRoles ur ON ur.UserId = u.UserId AND ur.RoleId = 39 
           INNER JOIN Customers c ON ur.CustomerId = c.CustomerID 
           WHERE u.UserId = 28 or u.UserTypeId = 3 or u.UserTypeId = 4 
           and c.customerId in 
            (SELECT c.CustomerId FROM Customers c 
            WHERE c.resellerId = u.CustomerId))))) 

Это дает мне следующее сообщение об ошибке -

Msg 116, уровень 16, состояние 1, строка 10
только один выражение может быть указано в списке выбора, когда подзапрос не вводится с EXISTS.
Msg 207, уровень 16, состояние 1, строка 3
Недопустимое имя столбца 'UserTypeId'.
Msg 209, уровень 16, состояние 1, строка 3
Неоднозначное название столбца «CustomerId».

+0

вы можете отформатировать свой запрос, пожалуйста? при редактировании сообщения есть панель инструментов над большой текстовой областью ... используйте кнопку '{}' и используйте пробелы для логических отступов и разрывов строк, чтобы их было легко читать/понимать ... –

+2

У вас есть 'c. CustomerId IN .... ', но затем вы выбираете набор данных с ** двумя столбцами ** - это никогда не будет работать! Если вы хотите проверить 'c.customerId', тогда суб-запрос должен возвращать набор значений' customerId' (и ** только ** эти значения - не дополнительные столбцы!) –

+3

Я думаю, что вы оставили хотя бы одно соединение против таблицы клиентов - серьезно, вам нужно присоединиться к клиентам в четыре раза? –

ответ

2
  1. Неоднозначное имя столбца 'CustomerId'

    Вы получаете это, потому что вы выбираете CustomerId без указания, какой стол, чтобы взять его с. Это название столбца существует на 3 ваших таблицах (UserRoles, Sites и Customers), один из которых вы соединяетесь дважды (Customers c и Customers rc). Вы должны сделать свой оператор выбора более явным, например.

    select 
        @custIdOfUser = c.CustomerId 
    
  2. Неверное имя столбца '' UserTypeId

    Эта колонка не существует ни на одном из ваших таблиц.

  3. только одно выражение может быть указан в списке выбора, когда подзапрос не вводится с EXISTS

    - потому что у вас есть это:

    c.customerId in ((SELECT u.CustomerId, ur.RoleId 
    

    , который должен быть таким:

    c.customerId in ((SELECT u.CustomerId 
    
+0

Сначала я хотел только исправить абзац, который должен быть этим, но потом решил добавить больше, что мне показалось, «улучшения». Если они вам не нравятся, пожалуйста, не стесняйтесь менять/откатывать их по своему усмотрению. –

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