Когда я выполняю этот запрос
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, но не в подзапросе.
Почему это поведение? Это - что-то с подзапросом?
Спасибо.
подзапросы наследуют колонны из внешних запросов.
Я думаю, что ваш uverotherdb.dbo.Customer имеет столбец CustomerID (который также представляется вероятным из имени).
, который также, вероятно, также означает, что вы не делаете с подзапросомком, что вы хотите сделать с ним - если таблица в подзапросе не имеет столбца CustomerId (и кажется, что иначе не будет ошибка при запуске Подзапрос само по себе), затем подзапрос выбирает и возвращает внешний CUSOLUNCEID, и, поскольку это единственный столбец в подзапросе, подзапрос бесполезно.
Ответ на ваш вопрос («Почему нет ошибок» ) выше, но, возможно, небольшая помощь о том, как избежать этого типа проблемы в будущем: вместо того, чтобы использовать подзапрос, чтобы сделать это, используйте левое соединение:
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
Этот запрос, когда построен с присоединением, который возможно, конечно , всегда будет работать, а также ваш оригинальный или лучше - и у вас есть дополнительное преимущество, чтобы избежать этой неприятности выше. Поскольку в этой конструкции вы будете естественным образом использовать имена таблиц, это будет более очевидно, когда возникает проблема, например, то же имя таблицы на обеих стороне равного знака. Подзапросы сосут, я на постоянном крестоне против них.
(что сказал, я знаю, что многие люди находятся на крестовом походе против алиасинга, которые я использовал выше, чтобы упростить / конденсировать код :))