如果我在2个表上执行SQL UNION,UNION用来确定任何2行相同的显式条件是什么?
在Postgres文档中,它仅指出“如果[it]出现在至少一个结果集中,则该行在两个结果集中的并集中”。如果结果集中出现[WHAT]?
它是否匹配column1,然后匹配column2,...?它如何决定停在columnX?
我对实际匹配规则没有明确说明感到有些惊讶。或者,我只用了10分钟的Google-ing就找不到它们。
感谢您的帮助。
答案 0 :(得分:4)
UNION(与UNION ALL相比)与DISTINCT相似,因为要删除重复项,所有列必须相同。
答案 1 :(得分:1)
我不确定您在问什么,但是也许就是这样。
在两个表上使用union
(或其他集合运算符)时,将按 position 比较行。所有列都必须匹配-也就是说,两个表中的列数必须相同。 Postgres将根据类型优先规则确定结果集中每一列的类型。任何一个表中的列都将转换为指定的类型。
那能满足您的要求吗?
实际上,这在documentation中有很多规定:
SQL UNION构造必须匹配可能不同的类型才能成为 一个结果集。解析算法分别应用于 联合查询的每个输出列。相交与例外 构造以与UNION相同的方式解析不同类型。的 CASE,ARRAY,VALUES,GREATEST和LEAST构造使用相同的 匹配其成分表达式并选择结果的算法 数据类型。
UNION,CASE和相关构造的类型解析
如果所有输入均为同一类型,并且不是未知的,则解析为 该类型。
如果任何输入属于域类型,则将其视为域的 所有后续步骤的基本类型。 [9]
如果所有输入的类型均为未知,则解析为文本类型(首选 字符串类别的类型)。否则,未知输入将被忽略 就其余规则而言。
如果未知输入不是所有相同类型类别,则失败。
选择第一个未知输入类型,它是其中的首选类型 该类别,如果有的话。
否则,选择最后一个未知输入类型,该类型允许所有 前面的未知输入要隐式转换为非未知输入。 (那里 总是这样的类型,因为至少列表中的第一个类型必须 满足此条件。)
将所有输入转换为所选类型。如果没有 从给定输入到所选类型的转换。