UNION在连接表中具有不相等的列

时间:2013-12-22 15:44:37

标签: php mysql union

构建查询以显示来自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 field1 field2 field3 field 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 fieldname使表格等于查询但是如果table1& table2有80个字段,table3有5个,这是否意味着我必须添加NULL AS fieldname6 ... 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

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

试试这个:

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

所有子查询必须具有相同的列数。顺便说一下,如果您不关心重复,union all优于unionUnion 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的每个组件执行此操作。

答案 1 :(得分:0)

必须是相同数量的列和类型(或者至少需要进行隐式转换。注意如果你做任何别名,你只需要在第一个选择中执行它,那就是给你列的那个结果中的名字。 因此,根据您在问题中所说的内容,所有选择必须有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

如果你不想三次命名所有列,一个临时表和三个插入就可以了,但不要这样做只是为了避免输入。