Подзапрос автоматически производит перекрестное соединение - PullRequest
1 голос
/ 30 апреля 2011

Я не уверен, ПОЧЕМУ, но когда я следую примеру (из базы данных northwind на сервере ms sql), чтобы выполнить подзапрос в Microsoft SQL Server Management Studio 2008, введя код, как показано ниже,

Select Orders.OrderID, 
       (Select Customers.CompanyName 
          From Customers 
          Where Customers.CustomerID = Orders.CustomerID) As Company Name
  From Orders, 
       Customers

Этот SQL-код с подзапросом автоматически получил перекрестное соединение и стал

    Select Orders.OrderID,
           (Select Customers.CompanyName 
              From Customers
             Where Customers.CustomerID = Orders.CustomerID) As Company Name
      From Orders 
CROSS JOIN Customers as Customers_1

Я играл с несколькими вариантами этого, но безуспешно в устранении этой проблемы. Это известная ошибка для Microsoft SQL Server Server Management Studio 2008? Если так, было ли оно исправлено, как мне найти исправленное? В противном случае, как я могу сообщить об этом в Microsoft и заставить их действительно быстро это исправить?

В моем фактическом запросе мне нужно 50 раз запросить / найти имя этой конкретной таблицы, уравняв ID, и я думаю, что просто глупо делать JOIN любого рода для этого, потому что код грубоват, ОЧЕНЬ долго, а производительность может быть плохой?

Ответы [ 3 ]

2 голосов
/ 30 апреля 2011

Подзапрос не вызывает перекрестное соединение, отсутствие условия, управляющего объединением, есть. Вам нужно что-то вроде этого:

Select Orders.OrderID, (Select Customers.CompanyName From Customers Where Customers.CustomerID = Orders.CustomerID) As Company Name 
From Orders, Customers
Where Orders.CustomerID = Customers.CustomerID
1 голос
/ 30 апреля 2011

Я не знаю, почему ваша книга предлагает подзапрос - я бы сделал это так:

Select Orders.OrderID, Customers.CompanyName 
  From Orders 
  left join Customers on Customers.CustomerID = Orders.CustomerID
0 голосов
/ 08 июля 2012

Похоже, что это должен быть коррелированный подзапрос

Выбор Orders.OrderID,

   (Select Customers.CompanyName 
      From Customers 
      Where **Customers.CustomerID = Orders.CustomerID**) As Company Name

Из заказов

-, - Клиенты

Зачем вам снова нужны клиенты, когда внутренний коррелированный подзапрос вводит имя клиента для каждого обрабатываемого заказа?

Настойчивость Management Studio при добавлении CROSS JOIN является предупреждением о том, что вы делаете что-то странное.Попытка выполнить запрос к двум таблицам: Клиент, Заказы без каких-либо условий соединения.

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

Где это уместно?Особенно, если вам нужно сгенерировать некий агрегат для внутреннего запроса.

...