UNION操作判定结果行DISTINCT的依据:基于主键还是所有列?
官方手册说明:
UNION实际上会将query2的结果追加到query1的结果之后(但不保证实际返回的行顺序如此)。此外,除非使用UNION ALL,否则它会像DISTINCT一样消除结果中的重复行。
PostgreSQL UNION 去重判定标准
PostgreSQL 中 UNION(不含 ALL)的去重判定完全基于查询返回的所有列,和原表的主键没有任何关联。
具体规则是:当两行数据的每一列对应值都完全相等时,就会被判定为重复行,进而被合并(仅保留一行)。哪怕两行来自不同的表,只要查询结果的所有列值完全一致,就会被视为重复而去除。
举个实际例子:
假设表 t1 存在数据 (1, 'apple'),表 t2 存在数据 (1, 'apple'),执行语句 SELECT id, fruit FROM t1 UNION SELECT id, fruit FROM t2,最终结果只会返回一行 (1, 'apple');如果执行的是 SELECT id FROM t1 UNION SELECT id FROM t2,只要两行的 id 值相同,就会被去重,和原表的其他字段或主键无关。
内容的提问来源于stack exchange,提问作者Julio Marins
相关产品推荐
相关产品推荐

