SQL 从表中选择并获取表名

Posted

技术标签:

【中文标题】SQL 从表中选择并获取表名【英文标题】:SQL select from table and get table name 【发布时间】:2014-04-03 06:05:03 【问题描述】:

我喜欢三个表,它们有一些相同的列,如 ID、名称、图像、... 我正在使用此代码从中选择

(SELECT ID, Name FROM `creatures` WHERE ... )
UNION
(SELECT ID, Name FROM `items` ...)
UNION
( ... FROM `anothertable` ... )

我在 php 中执行此操作,它为每个结果在表中创建一行。现在的问题是,我需要知道该行是从哪个表中获取的。我是 SQL 新手,我不知道它是否可以以某种方式完成。我想像这样的事情:

SELECT ID, Name, TableName FROM ...

有可能吗?

【问题讨论】:

正如一些答案指出的那样,UNION ALL 集合运算符比UNION 集合运算符更有效,因为它不会产生对结果集进行排序以识别和删除的开销在返回之前重复行。 好的,我肯定会使用它 :) 谢谢大家的回答 :) 【参考方案1】:

您可以在选择中添加一个指示表名的列;

(SELECT 'creatures' AS tablename, ID, Name FROM `creatures` WHERE ... )
UNION
(SELECT 'items' AS tablename, ID, Name FROM `items` ...)
UNION
( ... FROM `anothertable` ... )

附带说明,因为您想要 所有 行,使用 UNION ALL 更快,因为它不需要执行 DISTINCT 来消除重复。

【讨论】:

【参考方案2】:

您可以将表名作为字符串文字添加到每个查询中:

(SELECT 'creatures' AS table_name, ID, Name FROM `creatures` WHERE ... )
UNION
(SELECT 'items' AS table_name, ID, Name FROM `items` ...)
UNION
( ... FROM `anothertable` ... )

编辑: 请注意,由于您知道来自不同表的两行不能相等,因此您现在可以使用 union all 而不是 union,这可能会给您带来轻微的性能提升。

【讨论】:

【参考方案3】:

试试这个:

(SELECT ID, Name, 'creatures' as TableName FROM `creatures` WHERE ... )
UNION ALL
(SELECT ID, Name, 'items' as TableName FROM `items` ...)
UNION All
( SELECT ID, Name, 'anothertable' as TableName FROM `anothertable` ... )

示例结果:

ID   Name    TableName
1    Name1   creatures
2    Name2   creatures
1    Name3   items
1    Name5   anothertable

【讨论】:

【参考方案4】:

您可以简单地在 sql 中进行硬编码,如下所示

(SELECT ID, Name,'creatures' as TableName FROM `creatures` WHERE ... )
UNION
(SELECT ID, Name,'items' as TableName FROM `items` ...)
UNION
( ... FROM `anothertable` ... )

【讨论】:

以上是关于SQL 从表中选择并获取表名的主要内容,如果未能解决你的问题,请参考以下文章

从表中选择记录,其中表名来自另一个表

sql SQLSCRIPT HANA从表名中按字符串动态选择*

从表名中选择计数不同的列名作为cnt

PHP PDO - 绑定表名? [复制]

sql语句之from子句

sql 获取每个表中的表名和记录计数