将表名的“字段”添加到来自 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 结果?的主要内容,如果未能解决你的问题,请参考以下文章