Почему нет ошибки «Недопустимое имя столбца XYZ» в подзапросе; хотя имя столбца отсутствует в таблице подзапросов? - PullRequest
9 голосов
/ 21 января 2010

Когда я запускаю этот запрос

SELECT CustomerId FROM Stocks.dbo.Suppliers

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

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

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

Полностью определенное имя - просто соглашение, обе базы данных находятся на одном сервере.

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

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

Спасибо.

Ответы [ 2 ]

13 голосов
/ 21 января 2010

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

Полагаю, у вашего SomeOtherDb.dbo.Customer есть столбец CustomerId (что также, вероятно, следует из названий).

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

1 голос
/ 21 января 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...