5

NATURAL JOINを知り始めたばかりで、SQLiteは期待どおりに動作していません。

SELECT * FROM r1 NATURAL JOIN (r2 NATURAL JOIN r3);

SELECT * FROM (r1 NATURAL JOIN r2) NATURAL JOIN r3;

同じ(正しい)結果を生成します。

ただし、次のように括弧を省略した場合:

SELECT * FROM r1 NATURAL JOIN r2 NATURAL JOIN r3;

r1とr2は正しく結合されていますが、r3は結果にまったく結合されておらず、代わりにr1 NATURAL JOIN r2、r3のデカルト積が形成されています。

最初の結合結果の属性名に問題がありますか、それともSQLを誤って解釈していますか?

4

1 に答える 1

5

私自身はそのデータベースを使用していませんが、このドキュメントによると、SQLite のすべての結合は左右のテーブルのデカルト積に基づいています。

NATURAL結合では、共通の列名を「キー」として使用して、2 つのテーブルを結合します。括弧を使用すると、外部結合が処理される前に「派生テーブル」が強制的に作成されます。括弧がないと、共通の列名が「認識」されないため、2 番目のNATURALキーワードは無視されます。

ちょっとしたアドバイス: コードで a を見かけた場合に備えて、 a がどのように機能するかを理解することは良いことNATURAL JOINですが、自分で使用しないでください。これはほとんど価値のない「危険な」構造です。私の意見です。

于 2012-11-24T21:26:06.783 に答える