1

次のようなクエリがあります。

SELECT * FROM (SELECT linktable FROM adm_linkedfields WHERE name = 'company') as cbo WHERE group='BEST'

基本的に、メイン クエリのテーブル名はサブクエリを通じて取得されます。

エラーが表示されます#1054 - Unknown column 'group' in 'where clause'

調査すると (where 句を削除して)、クエリは常にサブクエリの結果のみを返すことがわかりました。

サブクエリ テーブルadm_linkedfieldsには構造がありますid | name | linktable

現在 PDO で MySQL を使用していますが、クエリは主要な DB (つまり、Oracle、MSSQL、PgSQL、および MySQL) と互換性がある必要があります。

更新: サブクエリは、メイン クエリのテーブルの名前を返す必要があります。この場合は元に戻りますtbl_company

tbl_companyメイン クエリ のテーブルの構造は次のとおりです。id | name | group

前もって感謝します。

4

3 に答える 3

1

動的 SQL はそのようには機能しません。作成したのはインライン ビューです。それを読んでください。さらに、すべてのデータベースで機能する動的 SQL クエリを作成することはできません。リンクテーブルの数が限られている場合は、左結合またはユニオンを使用してすべてのテーブルから選択することもできますが、正当な理由がない場合はそれを望まないでしょう。1 つのクエリでテーブル名を選択し、別のクエリを作成して適切なテーブルにアクセスします (php でクエリ文字列を作成します)。

于 2013-06-23T12:54:12.447 に答える
0

ここに問題があります:

SELECT * FROM (SELECT linktable FROM adm_linkedfields WHERE name = 'company') as cbo 
WHERE group='BEST';

「linktable」列を 1 つだけ含む DT から選択している場合、外側のブロックの where 句に他の列を入れることはできません。ブロックの観点から考えると、外側の選択は 1 つの列のみを含む DT を参照しています。

あなたがやろうとするとき、あなたの問題は似ています:

create table t1(x1 int);
select * from t1 where z1 = 7;  //error
于 2013-06-23T10:37:33.577 に答える
0

クエリは次のとおりです。

SELECT *
FROM (SELECT linktable
      FROM adm_linkedfields
      WHERE name = 'company'
     ) cbo
WHERE group='BEST'

まず、データベース間の互換性に関心がある場合は、SQL 予約語の後に列またはテーブルの名前を付けないでください。 group列の名前は本当に悪い名前です。

第二に、from句は名前のリストを含むテーブルを返しています(テーブルの、しかしそれは無関係です)。という列がないgroupため、それが問題です。

これを修正するために何ができますか? 単純な解決策は、サブクエリを実行して実行し、結果のテーブル名を動的ステートメントで使用して、必要なクエリを実行することです。

根本的な問題はデータ構造です。同じ構造を持つ複数のテーブルを持つことは、通常、設計が悪いことを示しています。基本的に 2 つの選択肢があります。

1。データベース構造を制御できる場合は、たとえば、すべてのデータを 1 つのテーブルに配置linktableします。これには、すべての会社の情報と、group(または名前を変更したもの) の列が含まれます。このソリューションは、すべてのデータベースで互換性があります。テーブルに非常に多くのデータがある場合 (数千万行と考えてください)、パフォーマンス上の理由からデータをパーティション分割することを考えるかもしれません。

二。データを制御できない場合は、すべてのテーブルを連結するビューを作成します。何かのようなもの:

create view vw_linktable as
    select 'table1' as which, t.* from table1 t union all
    select 'table2', t.* from table2 t

これは、すべてのデータベース間でも互換性があります。

于 2013-06-23T14:44:54.133 に答える