我非常惊讶,UNION只是简单地连接行而不检查列名是否匹配。
例如,
SELECT
1 AS bar,
2 AS foo
UNION ALL
SELECT
10 AS foo,
20 AS bar
Run Code Online (Sandbox Code Playgroud)
产生
bar foo
1 2
10 20
Run Code Online (Sandbox Code Playgroud)
而我希望 SQL 会抱怨两个表中第一列的名称不同。
这是 SQL 的预期行为吗?如果是这样,对我来说这似乎是一个出现语义错误的巨大机会。我可以使用哪些方法来防止犯这种错误?对于UNION有很多列的大型系统,除了手动检查之外,如何确保列按相同顺序排列?
UNION 你的两个表的列名是什么并不重要。UNION 运算符用于组合两个或多个 SELECT 语句的结果集。
每个 SELECT 语句中的列也必须具有相同的顺序
SELECT 1 AS bar, 2 AS foo -- here number of column in both table is same and data type also same so its fulfill condition on union
UNION ALL
SELECT 10 AS foo, 20 AS bar
Run Code Online (Sandbox Code Playgroud)即使你在下面编写sql,它也会正常工作,因为这里列数据类型顺序和列数是相同的
SELECT 1 AS bar, 2 AS foo
UNION ALL
SELECT 10 , 20
Run Code Online (Sandbox Code Playgroud)
所以它不会抛出任何错误