4

質問があります:

 (SELECT col1 AS table1 FROM table1 WHERE col3 IS NOT NULL)
    UNION ALL
    (SELECT col1 AS table2 FROM table2 WHERE  col3 IS NOT NULL)
    UNION ALL
    (SELECT col1 AS table3 FROM table3 WHERE col3 IS NOT NULL)

ただし、PDO とfetchAll(PDO::FETCH_ASSOC);コマンドを使用してこれを処理すると、生成された配列のキーは、実際のテーブルに関係なく、すべて table1 として出力されます。

私の構文は間違っていますか?ありがとう!

4

3 に答える 3

7

クエリは単一の列を返します。1 つの列は、1 つの名前/エイリアスのみを持つことができます。UNION クエリでは、最初のサブクエリが結果セットの列名を定義します。

各値がどのテーブルから来たかを指定したい場合は、次のように別の列を追加します。

(SELECT col1, 'table1' AS src FROM table1 WHERE col3 IS NOT NULL)
UNION ALL
(SELECT col1, 'table2'        FROM table2 WHERE col3 IS NOT NULL)
UNION ALL
(SELECT col1, 'table3'        FROM table3 WHERE col3 IS NOT NULL)
于 2013-02-18T07:26:12.060 に答える
2

それが SQL 仕様です。結果セットの列名は、最初の選択から取得されます。
それはまさにその通りです。

考えてみると、結果セットの途中で列名を変更することはできないため、後続の選択で異なる列名を使用しても意味がありません。列名は(1回)結果セットに対して定義されます。

于 2013-02-18T07:22:46.397 に答える
2

はい、これが機能する方法です。結合された値には、最初のクエリの列のエイリアスが含まれます。UNIONドキュメントページから引用:

最初の SELECT ステートメントの列名が、返される結果の列名として使用されます。

それが必要ない場合は、その列に必要な別名を付けてください。

于 2013-02-18T07:23:07.177 に答える