PostgreSQL多SELECT语句关联返回意外结果,如何处理?
解决SQL左连接产生笛卡尔积的问题
你当前的SQL里,LEFT JOIN使用了ON true,这个条件会让左表的每一条记录都和右表的所有记录建立关联,自然会产生笛卡尔积。
要得到两列颜色一一匹配的结果,有两种常见的解决方式:
方式一:按颜色值匹配
如果需要颜色值相同的记录关联,把连接条件改成两个颜色字段相等即可,修正后的SQL如下:
SELECT * FROM ( SELECT * FROM (VALUES ('Red'), ('Blue'), ('Green'), ('Yellow')) AS t (colors1) ) A LEFT JOIN ( SELECT * FROM (VALUES ('Red'), ('Blue'), ('Green'), ('Yellow')) AS t (colors2) ) B ON A.colors1 = B.colors2
方式二:按行顺序匹配
如果两个表的颜色顺序完全一致,想要按行的位置(比如左表第1行连右表第1行)关联,可以借助行号来实现:
SELECT A.colors1, B.colors2 FROM ( SELECT colors1, ROW_NUMBER() OVER () AS rn FROM (VALUES ('Red'), ('Blue'), ('Green'), ('Yellow')) AS t (colors1) ) A LEFT JOIN ( SELECT colors2, ROW_NUMBER() OVER () AS rn FROM (VALUES ('Red'), ('Blue'), ('Green'), ('Yellow')) AS t (colors2) ) B ON A.rn = B.rn
这两种方式都能得到你期望的Red Red、Blue Blue这类一一对应的结果。
内容的提问来源于stack exchange,提问作者dbApostle
相关产品推荐
相关产品推荐

