まず、完全に同等であるためには、最初のクエリを作成する必要があります
SELECT mw.*,
nvs.*
FROM mst_words mw
LEFT JOIN (SELECT *
FROM vocab_stats
WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no
WHERE (nvs.correct > 0 )
AND mw.level = 1
そのため、mw。*とnvs。*は一緒になって、2番目のクエリの特異な*と同じセットを生成します。 nvs.correctにフィルターが含まれているため、作成したクエリでINNERJOINを使用できます。
一般的な形式
TABLEA LEFT JOIN TABLEB ON <CONDITION>
attempts
条件に基づいてTableBレコードを検索します。失敗した場合、TABLEAの結果が保持され、TableBのすべての列がNULLに設定されます。対照的に
TABLEA INNER JOIN TABLEB ON <CONDITION>
また、attempts
条件に基づいてTableBレコードを検索します。 ただし 、失敗すると、TableAの特定のレコードが出力結果セットから削除されます。
CROSS JOINのANSI規格は、デカルト積 2つのテーブルの間。
TABLEA CROSS JOIN TABLEB
-- # or in older syntax, simply using commas
TABLEA, TABLEB
構文の目的は、TABLEAの各行がTABLEBの各行に結合されることです。したがって、Aの4行とBの3行は、12行の出力を生成します。 WHERE句の条件と組み合わせると、同じことを表すため(AとBの間の条件=>保持するかどうか)、INNERJOINと同じ動作を生成することがあります。ただし、コンマの代わりにINNER JOINを使用する場合の意図について読むと、はるかに明確になります。
パフォーマンス面では、ほとんどのDBMSは、内部結合よりも高速に左結合を処理します。カンマ表記は、データベースシステムが意図を誤って解釈し、不適切なクエリプランを生成する可能性があります。そのため、SQL92表記にはもう1つの利点があります。
なぜLEFTJOINが必要なのですか? 上記のLEFTJOINの説明がまだ十分でない場合(Bで一致することなくAにレコードを保持する)、同じことを達成するには、同じ効果を達成するために古いコンマ表記を使用する2つのセット間の複雑なUNIONが必要になると考えてください。 ただし、前述のとおり 、これはあなたの例には当てはまりません。これは実際には、左の結合の後ろに隠れている内側の結合です。
注:
- RIGHT JOINはLEFTと同じですが、AではなくTABLEB(右側)で始まる点が異なります。
- RIGHTおよびLEFTJOINSは両方ともOUTER結合です。 OUTERという単語はオプションです。つまり、
LEFT OUTER JOIN
と書くことができます。 。 - 3番目のタイプのOUTER結合は、FULL OUTER結合ですが、ここでは説明しません。