• ベストアンサー

同一カラム名でjoinしたところ、指定できない

SQLiteを使い始めました。 テーブルと結合(join)して あらたなテーブルを作ったのですが rankという同じカラム名があったので結果的に、rankとrank:1というカラム名が出来てしまいました。 次にこれを指定しようとして、rank.hogeではOKでしたが、rank:1.hogeでは駄目だと 怒られます。 これを解決する方法はないのでしょうか。。。(あらかじめ同じカラム名に ならないようにしておく、ということでしょうか?)

質問者が選んだベストアンサー

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

どういうSQL文を作ってるのか解りませんが、カラム名が同じ時はtable名も付けて区別します、同じtableをjoin するときは、別名(alias)を付けて区別します。 create table tblname as select 文なら、select 句に指定するカラム名がカラム名だけで区別できるように、カラム名にalias を付けます。 rank.hoge って、table名が rank で、 hoge がカラム名ですよね。 rank1 はどこから出てきたのかな?新規table名の方?join対象tableのalias? 例文 rank テーブルが、hoge,new,old のカラムを持ってるとして create table rankjoin as select rank0.hoge as r0hoge, rank0.old as veryold, rank1.hoge as r1hoge, rank1.new as new, rank1.old as old from rank as rank0 join rank as rank1 on rank0.new=rank1.old ; これで、rankjoin は、r0hoge,veryold, r1hoge, new,old のカラムを持つことになります。 rank1 対象にselect 例文作成すると select r0hoge,r1hoge, new from rank1; SQLiteなら、view も作成できるけど、select句のかち合うカラムには別名必要なのは同じ。

bs_hikapon
質問者

お礼

早速のご助言、ありがとうございます。 初心者なので説明が至らず、すみません。 テーブルA name | rank A | 重要 B | --- C | 参考 D | --- |... テーブルB name | rank A | B | 参考 C | 参考 D | ... |... をくっつけて name |Aのrank|Bのrank A | 重要 | B | --- | 参考 C | 参考 | 参考 D | --- | |... | ・・・というテーブルを作成したいのです。 ネットで調べると、outer joinなるものが使えそうなので select * from テーブルA left outer join テーブルB on テーブルA.name = テーブルB.name; でうまく行けそうだったので、先頭に create table テーブルC as...を付けて新規テーブルを 作成したところ、rank名が重複して name | rank | rank:1 A | 重要 | B | --- | 参考 C | 参考 | 参考 D | --- | |... | ・・・となってしまいました。。。ということです。 本来はここから、「なにもないnameを削除」して name | rank | rank:1 A | 重要 | B | --- | 参考 C | 参考 | 参考 というテーブルを作成したいのですが、rank:1を指定しようとして テーブルc.rank:1 としても、駄目、と言われてしまいました。 やはり最初のテーブルを作成するときの カラム名を重複させないようにしたほうがいいのでしょうか...?

bs_hikapon
質問者

補足

ご助言を読み直し、 select * from テーブルA left outer join テーブルB on テーブルA.name = テーブルB.name; で書き出す*をきちんと指定した上で、それぞれ 新たなカラム名をas hoge...で与えたところ 希望の結果が得られました。 どうもありがとうございました!

関連するQ&A