DBD::SQLiteでJOINした後にfetchrow_hashrefすると?
ほかのドライバがどうなっているのかは知らないけれど、fetchrow_hashrefをとりあえずDBD::SQLiteで動かしたときの結果をメモ。
結果は、平たく言うと二つのテーブルで名前がカブっているカラムのデータは右側(JOINしたほう)のカラムで上書き。ハッシュに左から順番に入れてるだけってのがよくわかる結果でした。カラム名がテーブル名で修飾されたりはしません。
#perl -w use strict; use warnings; use DBI; my $dbh = DBI->connect("dbi:SQLite:dbname=:memory:"); $dbh->do(qq|CREATE TABLE user(id INTEGER, name TEXT)|); $dbh->do(qq|CREATE TABLE score(uid INTEGER, score INTEGER, name TEXT)|); $dbh->do(qq|INSERT INTO user VALUES(1,'USER NAME')|); $dbh->do(qq|INSERT INTO score VALUES(1, 100, 'scoreName')|); my $sth = $dbh->prepare("SELECT * FROM user INNER JOIN score ON user.id=score.uid"); $sth->execute; while (my $row = $sth->fetchrow_hashref) { foreach(keys %$row){ print "$_\t$row->{$_}\n"; } } undef $sth; $dbh->disconnect;
こんなコードを実行。
一方で、fetchrow_arrayrefすると'USER NAME'のほうもちゃんと取れるので、両方欲しい時にはfetchrow_arrayref使いましょうってこった。
つーか違う意味で名前のカブったカラムなんか作るんじゃねぇよ!!ましてやそんなものJOINするなんて信じられない!!ってのが正しいですか?(AS句使え!)