【问题标题】:UNION with unequal columns in joined tables连接表中列不相等的 UNION
【发布时间】:2013-12-22 15:44:37
【问题描述】:

在构建查询以显示来自 2 个表的结果,其中 2 个相同但第三个不同(字段较少但共享需要在结果中返回的 4 列),构建查询?

表1:sku field1 field2 field3 field 4 field 5 field 6 field 7

表2:sku field1 field2 field3 field 4 field 5 field 6 field 7

表 3:sku 字段 1 字段 2 字段 3 字段 4

这两个当然都失败了:

SELECT * FROM table1 UNION SELECT * FROM table2 UNION SELECT * FROM table3 ORDER BY sku ASC

SELECT * FROM table1 UNION SELECT * FROM table2 UNION SELECT sku, field1, field2, field3, field4 FROM table3 ORDER BY sku ASC

在另一个SO post 中,我看到查询在哪里使用 NULL AS 字段名来使表等于查询,但是如果 table1 和 table2 说 80 个字段而 table3 有 5 个,这是否意味着我必须添加 NULL AS 字段名6 ...7...8....> 75 个字段?

只是一时兴起,我尝试如下,但也失败了:

SELECT * FROM table1 UNION SELECT * FROM table2 UNION SELECT sku, field1, field2, field3, field4, NULL AS * FROM table3 ORDER BY sku ASC

感谢您的帮助。

【问题讨论】:

  • 你真的需要做一个SELECT *吗?您不能只选择您需要的字段,还是您真的需要每个字段?
  • 实际的表(1 和 2)实际上有 75 个字段,其中 23 个字段需要查询。全选似乎比列出 23 个列名的查询更好
  • 哇,这是一个粗壮的查询! :D
  • 列出列名。在生产代码中使用星号(不包括它们在 EXISTS/NOT EXISTS 子句中的使用)不是一个好习惯。如果写出列名是痛苦,那么请熟悉 information_schema 并使用它来生成可以复制和粘贴的列名列表。

标签: php mysql union


【解决方案1】:

试试这个:

SELECT * FROM table1
UNION
SELECT * FROM table2
UNION
SELECT sku, field1, field2, field3, field4, NULL, NULL, NULL
FROM table3
ORDER BY sku ASC

所有子查询的列数必须相同。顺便说一句,如果你不关心重复,union allunion 好。 Union all 运行速度更快,因为没有重复删除。

编辑:

事实上,您应该明确列出每个表中所需的列:

SELECT sku, field1, field2, field3, field4, field5, field6, field7
FROM table1
UNION
SELECT sku, field1, field2, field3, field4, field5, field6, field7
FROM table2
UNION
SELECT sku, field1, field2, field3, field4, NULL, NULL, NULL
FROM table3
ORDER BY sku ASC;

而且,是的,您必须为union/union all 的每个组件执行此操作。

【讨论】:

  • gordon,有问题的实际表有 75 个字段(表 1 和 2),其中 23 个是查询结果需要/共享的,所以对于表 3 的选择部分我必须添加最后一个 SELECT 中有 52 个 NULL?
【解决方案2】:

必须是相同数量的列和类型(或者至少需要进行隐式转换。注意,如果您执行任何别名,您只需要在第一次选择中执行它,它就是为您提供列的那个结果中的名称。 因此,根据您在问题中所说的内容,所有选择都必须有 23 列,如果您使用 select *,则只需要 75 列,在我看来,如果您更改三个表中的任何一个,这将是一个错误是幸运的打破它。

SELECT sku, column2, etc FROM table1
UNION
SELECT sku, Column2, etc FROM table2
UNION
SELECT sku, column2, etc, NULL, NULL, NULL
FROM table3
ORDER BY sku ASC

如果您不想将所有列都命名三次,则可以使用一个临时表和三个 insert into 来完成,但不要为了避免输入而这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多