【问题标题】:Add "field" of table name to SQL results from UNION?将表名的“字段”添加到来自 UNION 的 SQL 结果?
【发布时间】:2025-12-17 08:35:01
【问题描述】:

如果我有一个简单的联合

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 |
+--------+-------+---------+

【问题讨论】:

    标签: mysql sql select union


    【解决方案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 个表要合并并且不想键入每个表的名称。更好的是,我想用一个简单的整数键创建一个查找表,该键标识原始表名,然后简单地将外键列添加到合并行的大表中。
    最近更新 更多