2017-03-27 10 views
2

今日、私はこの質問をいくつかの同僚と議論しましたが、これがうまくいかないという固い議論をすることはできません。相関サブクエリのエラー。 "MultiPart ID ohSalesOrderIDをバインドできませんでした"

誰かが私に確かな説明を与えることができますか?

これはクエリです:事前に

select oh.*, 
     test.* 
from Sales.SalesOrderHeader as oh, ( 
              select * 
              from Sales.SalesOrderDetail as od 
              where oh.SalesOrderID = od.SalesOrderID 
            ) as test; 

おかげで多くのことを。

+0

[キックする悪い習慣:古いスタイルを使用してJOINを - アーロンバートランドを](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad – SqlZim

+0

相関関係のあるサブクエリは単にそのコンテキストでは許可されていないため、同僚の誰もSQLに精通していないと思います。 –

答えて

4

最初に、JOIN構文を使用して、FROM句に相関サブクエリを配置することはできません。

第2に、,を使用すると、エイリアスの有効範囲に影響します。

はおそらくつもり:

select oh.*, test.* 
from Sales.SalesOrderHeader oh cross apply 
    (select * 
     from Sales.SalesOrderDetail od 
     where oh.SalesOrderID = od.SalesOrderID 
    ) test; 

できるのは、このだけでなくjoinとして容易フレーズ:

select oh.*, od.* 
from Sales.SalesOrderHeader oh join 
    Sales.SalesOrderDetail od 
    on oh.SalesOrderID = od.SalesOrderID; 

これは、SQLクエリとしてロジックを記述するための最も自然な方法です。

あなたの構文は、横結合のPostgres構文(これはapplyと同じ)を思い起こさせます。 Postgresのでは、これは次のようになります。

select oh.*, test.* 
from Sales.SalesOrderHeader oh, lateral 
    (select * 
     from Sales.SalesOrderDetail od 
     where oh.SalesOrderID = od.SalesOrderID 
    ) test; 
+0

ありがとうございます。 2つの質問。これらの2つのトピックについて2つの技術的な回答を挙げられますか? 1)なぜ技術的にSQL Serverが私にこれを許可しないのですか?まず、JOIN構文を使用してFROM句に相関サブクエリを入れることはできません。 2)それはどのように影響を与えますか? "第二に、あなたが使用すると、エイリアスのスコープに影響します。"あなたの助けに感謝します。 – Tito

+1

@Tito。 。 。 SQL ServerではSQL言語の一部であったことがないため、SQL Serverではこれを許可しません。決して。 '、'は ''フィールドをグループ化し、 ''十字結合 ''を行います。 2番目の部分の 'on'節で最初のテーブルを参照することはできません。しかし、あなたは 'from'節でカンマを使うべきではないので(Postgresの横結合やMS Accessの'十字結合 'のためにはうまくいきます)、これは問題ではありません。 –

関連する問題