2016-03-31 6 views
0
SELECT ProductID, 
     UnitPrice            AS SalePrice, 
     (SELECT ListPrice 
     FROM Production.Product 
     WHERE Product.ProductID = SalesOrderDetail.ProductID) AS ProductListPrice 
FROM Sales.SalesOrderDetail 

この問合せに疑問があります。副問合せの2つの選択文

サブクエリは、メインクエリで実行している間に実行されます。しかし、サブクエリだけを実行すると実行されません。

これは、マルチパート識別子「SalesOrderDetail.ProductIDは」 をバインドできませんでしたエラーに

をスローします。

誰かがなぜこのことが起こっていると伝えることができますか?

+2

あなたはサブクエリだけで 'SalesOrderDetail'を持っていません。 – sqluser

+0

''相関サブクエリ 'を探します。これは 'SQL'のかなり基本的なものです –

答えて

0

"SalesOrderDetail"が外部クエリのテーブルで、サブクエリに "渡している"ためです。

サブクエリが1つ以上の値を返している場合は、クエリが失敗します。

A(良い)と同等は次のようになります。あなたがメインクエリを実行すると

SELECT ProductID, 
     UnitPrice AS SalePrice 
     ListPrice AS ProductListPrice 
FROM Production.Product 
    INNER JOIN Sales.SalesOrderDetail 
     ON Product.ProductID = SalesOrderDetail.ProductID 
+0

これはProduction.Product行を持たない販売行を返さないでしょう –

+0

まあ、この状況で意味がありません.. 。あなたは持っていないものを売ることはできません。より合理的なので、LEFT JOINをINNERに変更しました。 –

0

、それはSalesOrderDetail.ProductID経由Product.ProductIDのすべての値を提供しています。サブクエリを独自に実行すると、これらの値を指定することはできません。

独自のサブクエリを実行する場合は可能ですが、独自の値を提供するためにはそれを少し変更する必要があります。このように:

SELECT ListPrice FROM Production.Product 
WHERE Product.ProductID IN (1, 2, 3) 

1,2および3は、返品したい商品リスト価格のIDです。

0

カラムリストの一部として持っているクエリは、通常、メインクエリのSalesOrderDetailテーブルを "参照"できます。クエリを単独で実行すると、SalesOrderDetailというテーブルが存在しないため、ProductId列を取得するためにテーブルを検索しようとすると、それを見つけることができず、エラーが発生します。

Production.ProductテーブルにProductIDが必要な行が1つしかない場合は、主にIDENTITYカラムなどを使用してIDを取得しているため、メインクエリが機能します。あなたが列リスト内のクエリは、1つの以上の結果を返すことができる場合、あなたは以下を取得することに注意する必要がありますが、将来のクエリの場合:

"Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression."

あなたは同じように簡単にサブずにクエリを書くことができますクエリ:あなたがそれのための受注を持っている場合は、常に製品を持っているだろうと思われるよう

SELECT ProductID, 
     UnitPrice AS SalePrice, 
     Product.ListPrice AS ProductListPrice 
FROM Sales.SalesOrderDetail 
INNER JOIN Production.Product ON Product.ProductID = SalesOrderDetail.ProductID 

あなたが、ここに任意のLEFT JOINAPPLYを必要としませんか?

いつも商品があるとは限りませんが、INNERを上記のLEFTに変更することができます。

関連する問題