用于获取表名的子查询

时间:2013-06-23 10:31:44

标签: mysql sql sql-server oracle postgresql

我有这样的查询:

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,但查询应与主要数据库兼容(即Oracle,MSSQL,PgSQL和MySQL)

更新 子查询应返回主查询的表名。在这种情况下,它将返回tbl_company

主查询的表tbl_company具有以下结构: id | name | group

提前致谢。

3 个答案:

答案 0 :(得分:1)

动态SQL不能像那样工作,你创建的是一个内联视图,阅读它。更重要的是,您无法创建可在每个数据库上运行的动态SQL查询。如果你有一个有限数量的链接表,你可以尝试使用左连接或联合从所有表中进行选择,但如果你没有充分的理由你不想这样做。 只需在一个查询中选择表名,然后再创建一个表来访问正确的表(通过在php中创建查询字符串)。

答案 1 :(得分:0)

这是一个问题:

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

您从DT中选择只包含一列“linktable”,然后您无法将任何其他列放在外部块的where子句中。根据块来考虑外部选择是指一个只包含一列的DT。

当您尝试执行此操作时,问题类似:

create table t1(x1 int);
select * from t1 where z1 = 7;  //error

答案 2 :(得分:0)

您的查询是:

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

首先,如果您对跨数据库兼容性感兴趣,请不要在SQL保留字后命名列或表。 group对于列来说是一个非常非常糟糕的名称。

其次,from子句返回一个包含名称列表的表(表格,但这是无关紧要的)。没有名为group的列,因此这就是您遇到的问题。

你能做些什么来解决这个问题?一个天真的解决方案是运行子查询,运行它,并在动态语句中使用结果表名来执行您想要的查询。

根本问题是您的数据结构。具有相同结构的多个表通常是不良设计的标志。你基本上有两个选择。

一。如果您可以控制数据库结构,请将所有数据放在单个表中,例如linktable。这将包含所有公司的信息,以及group的列(或任何重命名的列)。此解决方案兼容所有数据库。如果表中有大量的数据(想想数千万行),那么出于性能原因,您可能会考虑对数据进行分区。

两个。如果您无法控制数据,请创建一个将所有表连接在一起的视图。类似的东西:

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

这也适用于所有数据库。