2016-12-08 4 views
0

外部クエリのすべての行に対してセットを返すときに、内部サブクエリ(外部サブクエリを参照している)がどのくらい正確に機能しているかを理解するのに問題があります。私はそれが何をしているのか知っていますが、それはどうしますか。相関サブクエリは外部サブクエリを通してどのように 'ループ'しますか?

今のところ、私は "入れ子にされたループ"(プログラマーのバックグラウンドに由来していますが、データベースでは扱われていませんでした)としてそれを挑戦しています。しかし、私はステップバイステップロジックに続く困難を抱えています。

どのような種類のプログラミング言語でも一般的な 'forループ'では、外側ループが数えられ、ネストされたアクションを実行することを理解しています。それは私にはたくさんの意味があります。しかし、下のtsqlの例では、私はちょうど表示されていませんWHY外部クエリのすべての行に対して内部クエリが「実行」されるでしょう。それとも?

SELECT categoryid, productid, productname, unitprice 
FROM Production.Products AS P1 
WHERE unitprice = 
    (SELECT MIN(unitprice) 
    FROM Production.Products AS p2 
    WHERE P2.categoryid = P1.categoryid); 

次に、このサンプルを(TSQL2012データベースを使用)から採取された書籍に係る相関は述語P2.categoryid = P1.categoryidあります。 そして、P1.category IDはcategoryidのすべての行を循環し、それらのそれぞれについて最小単価を返します。

私の考えでは、P1.categoryidが保持する値がクエリによってどのように決定されるのか分かりません。

+0

(これは 'P1'がある)外部クエリの各行に対して、' P1.categoryid'には1つの値しか存在できません。サブクエリは 'p2'(サブクエリのProductsテーブル)の行だけを調べます。ここで' categoryid'は外部クエリの単一行の 'categoryid'と同じです。処理しています。これは、結合の場合とまったく同じです。クエリプロセッサが2つのレコードセットをどのようにマージするかは、クエリプロセッサによって異なります。いくつかの異なるマージ技術が利用可能です。 –

+0

さて、それは私には少し意味がありますが、私はまだ霧の中です。 JOINを使用してON句を指定すると、 't1.ID = t2.ID' と指定されています。私は、ON句を指定しています(行と一致させるため、特殊なJOINキーワード)。 しかし、2つのSELECT文がネストされている場合、どのようにそのような動作をエミュレートできますか? – starbyone

+0

おそらく[論理的なクエリ処理](http://sqlmag.com/sql-server/logical-query-processing-what-it-and-what-it-means-you)で読むことができます。ステートメントの一部が処理され、役立ちます。あるいは、あなたの[脳が逃げようとする](http://dilbert.com/strip/2016-11-30)かもしれません。 – HABO

答えて

1

外部クエリ(つまりP1がある)の各行に対して、P1.categoryidには1つの値しか指定できません。サブクエリはp2(サブクエリのProductsテーブル)の行のみを調べます。ここで、categoryidは外部クエリの単一行のcategoryidと同じです。処理しています。これは、結合の場合とまったく同じです。クエリプロセッサが2つのレコードセットをマージする方法は、クエリプロセッサによって異なります。いくつかの異なるマージ技術が利用可能です。サブクエリはwhere句であるため、単価がない製品のそのカテゴリの最低単価です

事実、それは単純にすべての行を排除するために、結果セットをフィルタリングします。すなわち、各カテゴリの最低価格商品[s]を選択する。

関連する問題