0

サブ結合を使用すると、同じ結果を生成する2つの異なる方法に気づきました。サブ結合内では、「select」を使用して2つのテーブルを結合し、後続の行で参照されるエイリアスを指定します。もう1つは、2つのテーブルを「匿名で」結合するだけで、後続の行はサブ結合のテーブルエイリアス名を使用します。以下にサンプルコードがあります。私の質問は次のとおりです。

  1. これらは同等であり、キーストロークを節約するだけですか?

  2. 'select'を使用する一方は一時テーブルを作成しますが、もう一方は作成しませんか?

  3. 2つの間にパフォーマンスの違いはありますか?実行アナライザーに基づくものはないと思いますが、お願いしたいと思いました。

  4. 1つまたは他の「サブジョインスタイル」の「名前」はありますか(たとえば、エイリアスサブジョインと匿名サブジョインの違いはありますか?)

  5. テーブル名と列名のエイリアシングのスコープ規則に関する限り、このような状況を説明する可能性のある、誰かが私に指摘できる優れたドキュメントはありますか?検索しましたが、一致するものが見つかりません(「正しく」検索しているかどうかはわかりませんが)?

2つのクエリは次のとおりです。

SELECT bp1.*, b1.* 
from Bugs b1 
JOIN BugsProducts bp1 ON b1.bug_id = bp1.bug_id
LEFT OUTER JOIN (select b2.*, bp2.product_id 
                from Bugs b2 
                JOIN BugsProducts bp2 ON b2.bug_id = bp2.bug_id) AS sub1
ON (bp1.product_id = sub1.product_id AND (b1.date_reported < sub1.date_reported))
WHERE sub1.bug_id IS NULL;

SELECT bp1.*, b1.* 
from Bugs b1 
JOIN BugsProducts bp1 ON b1.bug_id = bp1.bug_id
LEFT OUTER JOIN (Bugs b2 JOIN BugsProducts bp2 ON b2.bug_id = bp2.bug_id)
ON (bp1.product_id = bp2.product_id AND (b1.date_reported < b2.date_reported))
WHERE b2.bug_id IS NULL;
4

2 に答える 2

2

このトピックをさらに調査したところ、探していた答えが見つかりました。これが将来誰かに役立つことを願っています。

「サブクエリ」で JOIN を実行する場合、最初のケースのように、サブクエリにエイリアスを指定する必要があるため、そのサブクエリからのデータを参照するときにそのエイリアスを使用する必要があります。サブクエリで JOIN を使用すると、返されるフィールドやフォーマット方法などをより詳細に制御できるため、データを「カスタマイズ」する必要がある場合には、これが望ましい場合があります。このようなサブクエリから返されるデータは、とりわけ「仮想テーブル」または「派生テーブル」と呼ばれることがあります。

私の例の 2 番目のケースは、単なる「Mutli-Join」です。それ自体には特別なことは何もありません。入力が少なくて済み、戻りフィールドをカスタマイズする必要がない場合に適しています。

どちらのクエリも、私の環境では同一の実行パスを生成します。YMMV。

より完全な説明については、サブクエリと結合 (他のサブクエリのトピックの中でも) を説明する良い記事があります: https://www.simple-talk.com/sql/sql-training/subqueries-in-sql-server/

于 2013-02-26T17:39:52.033 に答える
0

これだけ使っていただけませんか?:

SELECT bp1.*, b1.* 
FROM bugs b1, bugsproducts bp1 
WHERE b1.bug_id = bp1.bug_id AND b1.bug_is IS NULL

エイリアスは私にとってより簡単で、コードがよりクリーンで短いように思われるため

そして何をすべきか

(b1.date_reported < b2.date_reported)

return, isnt b1 = Bugs and b2 = Bugs, したがって、同じテーブル

于 2013-02-22T21:43:41.807 に答える