1

私はLearning SQL 2nd Editionの本を読んでいました。SETオペレーションと の間に違いはありますか?オペレーションを離れるJOIN状況はありますか?SETJOIN

私が間違っている場合は訂正してJOINくださいSET

4

2 に答える 2

3

集合演算はUNIONINTERSECTEXCEPTです。これらは、同じスキーマを持つリレーションに対して集合操作を行うために使用されます。例: letR1R2be は次のスキーマのものです。

R1 (A,B,C)
R2 (A,B,C)
  • R1 R2 =およびUNIONのすべての行の結合。R1R2

  • R1 R2 =とINTERSECTの両方の共通行。R1R2

  • R1 EXCEPTR2 = からのすべての行R1が に存在しませんR2

同じスキーマ関係で集合操作を使用しますが、結果のスキーマが両方のスキーマの和集合である異なるスキーマ関係で結合操作を使用できることに注意してください。(通常、2 つ以上のテーブルを結合するために結合操作を使用します。)

于 2012-12-04T14:21:40.763 に答える
1

joinいいえ、集合操作でできるすべてのことを で行うことはできません。ただし、2 つのテーブルの構造が同じでそれぞれに一意の識別子がある場合は、次のことができます。

Aunionは次のようになります。

select driver.id,
       coalesce(t1.col1, t2.col1) as col1,
       . . .  -- repeat this for all columns
from (select distinct coalesce(t1.id, t2.id) as id
      from ((select id
             from t1
            ) full outer join
            (select id
             from t2
            )
           )
     ) driver left outer join
     t1
     on t1.id = driver.id left outer join
     t2
     on t2.id = driver.id

exceptintersectも同じ方法でアプローチできますが、条件をドライバー テーブルに入れますfull outer join

実際、行が各テーブルで一意であると仮定して、一意の ID を必要としないようにこの考え方を拡張できます。その場合、すべての列を含める必要があり、列の NULL 値も考慮する必要があるため、結合はより複雑になります。

とはいえ、このset操作にはいくつかの利点があります。

  1. それらはより読みやすいです。あなたと他の誰もがおそらくそれに同意しunionunion all上記のクエリよりもはるかに読みやすいでしょう.
  2. SQL エンジンは集合操作を理解するので、通常はより効率的になります。
  3. より複雑な SQL ステートメントでは、結果を根本的に変える微妙なエラーが発生しやすくなります。たとえば、上記のドライバ テーブルの「完全な外部結合」を「内部結合」に変更することは、 と の違いunionですintersect
于 2012-12-04T14:36:56.860 に答える