1

理由はわかりませんが、例(ms sqlサーバーのnorthwindデータから)に従って、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 Management Studio 2008の既知のバグですか?パッチが適用されている場合、パッチを適用するにはどうすればよいですか?それ以外の場合、これをMicrosoftに報告して、実際に迅速に修正してもらうにはどうすればよいですか?

私の実際のクエリでは、IDを等しくすることによってこの特定のテーブルの名前を約50回クエリ/ルックアップする必要があります。コードが不器用で非常に長いため、これに対して何らかのJOINを実行する必要があるのは単純に愚かだと思います。パフォーマンスが悪い可能性がありますか?

4

3 に答える 3

2

サブクエリがクロス結合を引き起こしているのではなく、結合を制御する条件がないことが原因です。次のようなものが必要です。

Select Orders.OrderID, (Select Customers.CompanyName From Customers Where Customers.CustomerID = Orders.CustomerID) As Company Name 
From Orders, Customers
Where Orders.CustomerID = Customers.CustomerID
于 2011-04-30T03:12:38.597 に答える
1

あなたの本でサブクエリが提案されている理由がわかりません-私は次のようにします:

Select Orders.OrderID, Customers.CompanyName 
  From Orders 
  left join Customers on Customers.CustomerID = Orders.CustomerID
于 2011-04-30T04:17:33.077 に答える
0

相関サブクエリであるように見えます

Orders.OrderID を選択し、

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

注文から

--, -- お客様

内部の相関サブクエリが処理される各注文の顧客名を取得するときに、再び顧客が必要になるのはなぜですか?

CROSS JOIN の追加に対する Management Studio の主張は、あなたが奇妙なことをしているという警告です。2 つのテーブルをクエリしようとしています: Customer, Orders 結合条件なし。

また、クエリ オプティマイザは通常、処理中にこれらの相関サブクエリを結合に変換しますが、必要に応じてより明確な構文を使用できます。

どこが適切ですか?特に、内部クエリで何らかの集計を生成する必要がある場合。

于 2012-07-08T00:05:43.573 に答える