2012-01-10 2 views
2

は、私は次のクエリのように、同じ名前にエイリアスへの2つの列を強制することができますようにテーブル内に列名を複製する用途はありますか? sqlite3ので

overloaded_name overloaded_name 
--------------- --------------- 
1    2 
3    4 
...    ... 

...と:

SELECT field_one AS overloaded_name, 
     field_two AS overloaded_name 
FROM my_table; 

それは次を返します。

私は同じ構文を使用してという名前のテーブルを作成する場合は、それが:1とエイリアスのいずれかを追加:

sqlite> CREATE TABLE temp AS 
      SELECT field_one AS overloaded_name, 
       field_two AS overloaded_name 
      FROM my_table; 
sqlite> .schema temp 
CREATE TABLE temp(
    overloaded_name TEXT, 
    "overloaded_name:1" TEXT 
); 

私はこれが可能だった場合だけ見るために元のクエリを実行し、私がいましたそれが許されたことに驚いた。これを行うには何らかの正当な理由はありますか?それがないと仮定すると、なぜこれはまったく許されますか?

EDIT

私は明確にすべき:質問は二つです:なぜ、テーブルの作成は成功させて、(もっと重要なのは)なぜ原稿が最初の場所で許可を選択していますか?

また、テーブルの作成に関して私の説明を参照してください。

答えて

3
単に私がを好むが、SQLiteのの開発者は、おそらくより多くのリベラル(以下、肛門保持型)ですあろうこと であなたの要求を、拒否するだろう

2つの列に同じ名前の別名を付けることができます... 最初に[this]は許可されていますか?

これは、shackles of compatibilityに起因する可能性があります。 SQL標準では、何も非難されることはありません。初期のバージョンの標準では、おそらく影響力のあるベンダーがバグを含めるか、または設計フィーチャの省略による可能性があり、準備されていなかったために、テーブル式の結果に重複した名前の列を含めることができました顧客のコードを破る危険性を抱えています(もう一度互換性の問題があります)。

テーブルに列名を複製する用途はありますか?

In the relational model, every attribute of every relation has a name that is unique within the relevant relation。 SQLでは重複した列名が許されているだけなので、SQLコーダーとして機能を利用する必要はありません。実際には、この機能を誤って起動しないように注意しなければならないと言いたいと思います。私はテーブルに列名を重複させるのが良い理由は考えていないが、多くの明らかな悪いものを考えることができる。そのようなテーブルは関係ではなく、それは良いことではありません!

SQL規格(の別名意図的な違反)へ

確かに「拡張」を成功するために許可され、[ベース]テーブルの作成である理由、私はそれが合理的な機能として認識することができたとします。名前が重複する列を作成しようとすると、システムは自動的に序数に接尾辞を付けて曖昧性を解消します。実際には、SQL標準では、テーブル式の結果がで暗黙的にに重複する列名を持たないように実装に依存する方法が指定されています(しかし、質問で指摘したように、ユーザーをから明示的に重複したAS句を使用して)。しかし、私は個人的には、重複した名前を拒否し、エラーを起こすという標準的な動作が正しいと思います。上記の理由とは別に(つまり、同じテーブル内の重複した列はあまり役に立たない)、システムがその名前を尊重しているかどうかを知らずにオブジェクトを作成するSQLスクリプトは、エラーが発生しやすくなります。

+0

ありがとうございました!リンクされたソース(プレゼンテーション?)は面白かったですが、接線的に関連していました。さらなる参考文献を提供するほど親切であれば、私の質問に完全に答えることができるように感じます。 – Nate

+0

@ネイト:私は私の答えの2番目の部分のリンク(ソース)を追加しました。私の答えの最初の部分については、私はそれ以上のリンクはありません。自由に利用できるSQL標準仕様は[SQL-92(draft)](http://www.contrib.andrew.cmu.edu/~shadow/)です。 sql/sql1992.txt)。私の答えの3番目の部分は完全に私の意見です:) – onedaywhen

1

挿入と更新が混乱するため、テーブル自体に列名が重複することはありません。どの列がデータを取得しますか?

選択中、「複製」は列ラベルなので何も傷つけません。

1

私はあなたがCREATE TABLE ... AS SELECTコマンドについて話していると仮定します。これは私のSQL拡張のように見えます。

標準SQLでは、異なる列に同じ列名を使用することはできません.SQLiteでは、その列が拡張子で許可されているように見えますが、その周囲を処理しているようです。単純な裸のselectステートメントでは、asを使用して列名を設定するだけですが、create table ... as selectでは、この列名を使用して新しいテーブルを作成します。

余談として

、あなたがそのようなorder by句のように、使用重複列にしようとすると、裸selectが何をするかを見るのは興味深いだろう。

あなたが同じ名前で複数の列を持つことが許された場合は、実行エンジンは、あなたが何を意味するかを把握するために、それは少し難しいだろう:

select overloaded_name from table; 

あなたが行うことができる理由あなたは単一name列で終わるように

select id, surname as name from users where surname is not null 
union all 
select id, firstname as name from users where surname is  null 

:それは、選択中のようなものをできるようにすることです。

理由があるかどうかに関しては、SQLiteは(おそらく)です.2つの異なる列に同じ列名を指定したときに何をしているのかが分かっていることを前提とします。その本質は、(たとえば、列が動的に型付けされていることからもわかるように)ユーザーに多大な寛容さを与えることにあるようです。

代替はより私が:-)

+0

ありがとうございます。あなたの組合の例に感謝します、それは助けになりました。カップルの参考資料を提供できれば、これで問題にうまく答えることができたと思います。 – Nate

関連する問題