SQL UNION 不检查匹配的列名——这取决于我吗?

Hei*_*erg 11 sql

我非常惊讶,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有很多列的大型系统,除了手动检查之外,如何确保列按相同顺序排列?

Zay*_*hin 5

UNION 你的两个表的列名是什么并不重要。UNION 运算符用于组合两个或多个 SELECT 语句的结果集。

  • 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)

所以它不会抛出任何错误

  • 添加:您甚至不需要第二个 select 语句的名称。 (5认同)