将表名的“字段”添加到来自 UNION 的 SQL 结果?

Posted

技术标签:

【中文标题】将表名的“字段”添加到来自 UNION 的 SQL 结果?【英文标题】:Add "field" of table name to SQL results from UNION? 【发布时间】:2012-10-11 03:13:34 【问题描述】:

如果我有一个简单的联合

select name, phone from users union select name, phone from vendors;

有没有办法将表名添加到结果中?

所以不是

+--------+-------+
| name   | phone |
+--------+-------+
| Jim    | 123...|
| Macy's | 345...|
+--------+-------+

我会得到

+--------+-------+---------+
| name   | phone | table   |
+--------+-------+---------+
| Jim    | 123...| users   |
| Macy's | 345...| vendors |
+--------+-------+---------+

【问题讨论】:

【参考方案1】:
select name, phone, 'users' as table_name from users
union
select name, phone, 'vendors' as table_name from vendors;

更好的解决方案是使用union all,这样服务器就不会检查不同的值

select name, phone, 'users' as table_name from users
union all
select name, phone, 'vendors' as table_name from vendors;

【讨论】:

哦,哇,我真的想到了,但觉得太简单了。谢谢! 不同之处在于,如果用户和供应商拥有相同的信息,我会得到具有不同 table_name 的两个结果?还是我解释 UNION ALL 错了? 谢谢@MartinSmith,是的,实际上更好。当您使用union 时,服务器将尝试只给您不同的结果。实际上,这将是相同的结果集,但最好不要用额外的工作来打扰服务器:) @user1484099 - 不同的table_name 意味着两组之间绝对不会有任何重复。如果您想删除任何一组中的重复项,最好在相关的单个查询中使用 DISTINCT 并将它们与 UNION ALL 结合使用。 我找到了我的部分问题的答案,但有一个额外的转折:我有大约 120 个表要合并并且不想键入每个表的名称。更好的是,我想用一个简单的整数键创建一个查找表,该键标识原始表名,然后简单地将外键列添加到合并行的大表中。

以上是关于将表名的“字段”添加到来自 UNION 的 SQL 结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何保护带有参数化表名的查询不被注入

如何在perl中绑定表名的值?

多对一公式将表名附加到 SQL 关键字

mysql,想将表A字段a的数据复制到表B的a字段,应该如何写?

在sql语句中,怎样将参数做为表名传递到查询语句中

SQL VBA:选择具有特定表名和字段名的所有表