Почему не “Недопустимое имя столбца XYZ” ошибка в подзапросе; хотя имя столбца не находится в подтаблице запроса?

Когда я выполняю этот запрос

SELECT CustomerId FROM Stocks.dbo.Suppliers

Это дает мне эту ошибку. Недопустимое имя столбца 'CustomerId'. Эта ошибка допустима, поскольку нет никакого столбца CustomerId в таблице поставщиков; но когда я использую тот же запрос в подзапросе, он не дает ошибки, Например.

SELECT * 
  FROM SomeOtherDb.dbo.Customer 
 WHERE CustomerId In( SELECT CustomerId 
                        FROM Stocks.dbo.Suppliers)

Здесь я ожидаю ту же ошибку "Недопустимое имя столбца", но выполнения запроса без любой ошибки.

Полностью определенное имя является просто конвенцией оба, какие dbs находятся на том же сервере.

CustomerId делает существует в SomeOtherDb.dbo. Таблица Customer, но не в подзапросе.

Почему это поведение? Это - что-то с подзапросом?

Спасибо.

11
задан OMG Ponies 21 January 2010 в 16:44
поделиться

2 ответа

подзапросы наследуют колонны из внешних запросов.

Я думаю, что ваш uverotherdb.dbo.Customer имеет столбец CustomerID (который также представляется вероятным из имени).

, который также, вероятно, также означает, что вы не делаете с подзапросомком, что вы хотите сделать с ним - если таблица в подзапросе не имеет столбца CustomerId (и кажется, что иначе не будет ошибка при запуске Подзапрос само по себе), затем подзапрос выбирает и возвращает внешний CUSOLUNCEID, и, поскольку это единственный столбец в подзапросе, подзапрос бесполезно.

14
ответ дан 3 December 2019 в 07:37
поделиться

Ответ на ваш вопрос («Почему нет ошибок» ) выше, но, возможно, небольшая помощь о том, как избежать этого типа проблемы в будущем: вместо того, чтобы использовать подзапрос, чтобы сделать это, используйте левое соединение:

SELECT C.* 
FROM SomeOtherDb.dbo.Customer AS C
LEFT JOIN Stocks.dbo.Suppliers AS S ON C.CustomerId = S.CustomerId
WHERE S.CustomerID Is Null

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

(что сказал, я знаю, что многие люди находятся на крестовом походе против алиасинга, которые я использовал выше, чтобы упростить / конденсировать код :))

2
ответ дан 3 December 2019 в 07:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: