2016-04-03 12 views
1

私は、このクエリで自然結合操作の結果にエイリアスを与えることをMySQLに要求しないことに気づきました: SELECT * FROM TABLE1 NATURAL JOIN TABLE2、 しかし、派生テーブルではないためエイリアスが必要ですか? これは本当にこの質問へのフォローアップの質問です:Every derived table must have its own alias - when is something a derived table?、と私は、そこには、クエリのFROM部分の '新しい'テーブルは、テーブルを派生され、そのような別名が必要と言われました。 実際にエイリアスが必要ない場合は、この新しいテーブルを次のようなサブクエリでどのように参照しますか:SELECT * FROM TABLE1 NATURAL JOIN TABLE2 WHERE NOT EXISTS (SELECT * FROM TABLE1 WHERE attribute1='thenewtable'.attribute2)自然な結合の結果として表の名前は何ですか?

+0

いいえそれは 'SELECT 1'と' SELECT * FROM(SELECT 1) 'の違いです、例えば – Strawberry

+0

選択クエリのレコードセットは新しいテーブルではありません。クエリに結合があるかどうかは関係ありません。あなたが試しているように見える限り、単純なwhere節(where attribute1 <> attribute2')を単純に使うことができます。 –

+0

多分興味深い?それは「自然な結合」が「あまり良くない」ことが分かります。私はupvotedコメントのいくつかを読むことをお勧めします。 - [自然結合と内部結合の違い](http://stackoverflow.com/questions/8696383/difference-between-natural-join-and-inner-join) –

答えて

1

まず、NATURAL JOINを使用しないでください。それは起こるのを待っているバグです。

なぜですか?これは、同じという名前を使用してテーブルを結合するだけなので、列の名前はです。たとえば、私は多くの場合、すべてのテーブルにCreatedAtというカラムを持っていますが、これをジョインに使用することは決してありません。 USING節を代わりに使用する方が、明示的に使用されている列がリストされているので、はるかに好ましいことです。

NATURAL JOINが明示的に定義された外部キー関係を使用していた場合、私はそれについてより気分が良いことに注意してください。しかし、明示的に定義された外部キーの関係は無視されます。

いずれの場合でも、質問に対する回答は、クエリで定義されているテーブルの別名を使用してテーブルの列を参照できるということです。だから、あなたが書くことができます。この場合

select table1.col1, table2.col2 
from table1 natural join 
    table2; 

をテーブル名は、独自のエイリアス(私は通常、t1t2としてテーブル略語です明示的な別名を使用します)です。

派生テーブルの引用は、別名を必要とするFROM句のサブクエリに関するものです。クエリのFROM句にサブクエリはありません。

NATURAL JOINSELECT *の利点は、重複する列名を削除することです。しかし、私はこれがその構文を使う良い理由だとは思わない。

関連する問題