5

次の2つのテーブルがあります。

フー:

ID     NUMBER(38)
DATA   VARCHAR2(10)

バー:

ID     NUMBER(38)
FOO_ID NUMBER(38)
DATA   VARCHAR2(10)

PDO次のクエリを発行するために使用する場合:

SELECT * FROM foo f INNER JOIN bar b ON (f.id = b.foo_id)

結合からすべての列を何らかの自動エイリアス形式 (「FOO.ID」、「FOO.DATA」、「BAR.ID」など) に戻す方法はありますか?クエリ内のすべての列を指定してエイリアスする必要はありませんか?

さまざまなフェッチ モードに関するドキュメントをすべて読み、ほとんどのフラグ/オプションを試しましたが、探しているものが見つからないようです。

アップデート:

を使用するPDO::FETCH_ASSOCと、 の列が の列fooで上書きされているように見えますbar:

array(3) {
  ["ID"]=>
  string(1) "1"
  ["DATA"]=>
  string(5) "bar 1"
  ["FOO_ID"]=>
  string(1) "1"
}

を使用すると、とPDO::FETCH_NUMの両方の列が順番に表示されますが、各テーブルの列の数とそれらの列の正確な順序を知る以外に、どの列がどのテーブルから来たかを識別する方法はありません (エラーが発生しやすい):foobar

array(5) {
  [0]=>
  string(1) "1"
  [1]=>
  string(5) "foo 1"
  [2]=>
  string(1) "1"
  [3]=>
  string(1) "1"
  [4]=>
  string(5) "bar 1"
}

を使用すると、 とを組み合わせた場合とPDO::FETCH_BOTH同じ問題に遭遇し、恐ろしく理解できない結果セットが作成されます。PDO::FETCH_ASSOCPDO::FETCH_NUM

array(8) {
  ["ID"]=>
  string(1) "1"
  [0]=>
  string(1) "1"
  ["DATA"]=>
  string(5) "bar 1"
  [1]=>
  string(5) "foo 1"
  [2]=>
  string(1) "1"
  ["FOO_ID"]=>
  string(1) "1"
  [3]=>
  string(1) "1"
  [4]=>
  string(5) "bar 1"
}

理想的には、結果セットは次のようになります。

array(5) {
  ["FOO.ID"]=>
  string(1) "1"
  ["FOO.DATA"]=>
  string(5) "foo 1"
  ["BAR.ID"]=>
  string(1) "1"
  ["BAR.FOO_ID"]=>
  string(1) "1"
  ["BAR.DATA"]=>
  string(5) "bar 1"
}
4

3 に答える 3

2

いいえ、できません。少なくとも次のことを行う必要があります。

SELECT f.*, b.* FROM foo f INNER JOIN bar b ON (f.id = b.foo_id)
于 2012-08-30T15:02:59.287 に答える
1

カーテンの後ろでこれを行う方法はないようです。明示的なエイリアシングが唯一の方法です。

于 2012-09-26T21:09:47.520 に答える
0

これを試して:

SELECT f.ID as fID, f.DATA as fDATA, b.*, FROM foo f INNER JOIN bar b ON (f.id = b.foo_id)

アイデアは、競合する属性のみを変更して、競合が発生しないようにすることです。

于 2015-12-08T18:09:34.593 に答える