SQL UNION-隐式匹配条件是什么?

时间:2018-07-18 16:12:52

标签: sql postgresql union

如果我在2个表上执行SQL UNION,UNION用来确定任何2行相同的显式条件是什么?

在Postgres文档中,它仅指出“如果[it]出现在至少一个结果集中,则该行在两个结果集中的并集中”。如果结果集中出现[WHAT]?

它是否匹配column1,然后匹配column2,...?它如何决定停在columnX?

我对实际匹配规则没有明确说明感到有些惊讶。或者,我只用了10分钟的Google-ing就找不到它们。

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

UNION(与UNION ALL相比)与DISTINCT相似,因为要删除重复项,所有列必须相同。

答案 1 :(得分:1)

我不确定您在问什么,但是也许就是这样。

在两个表上使用union(或其他集合运算符)时,将按 position 比较行。所有列都必须匹配-也就是说,两个表中的列数必须相同。 Postgres将根据类型优先规则确定结果集中每一列的类型。任何一个表中的列都将转换为指定的类型。

那能满足您的要求吗?

实际上,这在documentation中有很多规定:

  

SQL UNION构造必须匹配可能不同的类型才能成为   一个结果集。解析算法分别应用于   联合查询的每个输出列。相交与例外   构造以与UNION相同的方式解析不同类型。的   CASE,ARRAY,VALUES,GREATEST和LEAST构造使用相同的   匹配其成分表达式并选择结果的算法   数据类型。

     

UNION,CASE和相关构造的类型解析

     
      
  1. 如果所有输入均为同一类型,并且不是未知的,则解析为   该类型。

  2.   
  3. 如果任何输入属于域类型,则将其视为域的   所有后续步骤的基本类型。 [9]

  4.   
  5. 如果所有输入的类型均为未知,则解析为文本类型(首选   字符串类别的类型)。否则,未知输入将被忽略   就其余规则而言。

  6.   
  7. 如果未知输入不是所有相同类型类别,则失败。

  8.   
  9. 选择第一个未知输入类型,它是其中的首选类型   该类别,如果有的话。

  10.   
  11. 否则,选择最后一个未知输入类型,该类型允许所有   前面的未知输入要隐式转换为非未知输入。 (那里   总是这样的类型,因为至少列表中的第一个类型必须   满足此条件。)

  12.   
  13. 将所有输入转换为所选类型。如果没有   从给定输入到所选类型的转换。

  14.