Postgresql关系加入

时间:2013-07-19 04:24:19

标签: sql database postgresql postgresql-9.1

我有两个关系relation1和relation2,其中relation1有列A,B,C,relation2有列D,E,F。对于查询,我在关于C = F的relation1和relation2上进行完全连接。

SELECT A,B,C,D,E,F 
  FROM relation1 r1 FULL JOIN relation r2 
    ON r1.C=r2.F

所以当C = F时,结果包含

A,B,C,D,E,F values

当C不在F中时,结果包含

A,B,C, null,null,null

当F不在C中时,结果包含

null,null,null,D,E,F

这就是我的期望。现在我想做C,F在结果中用相同的名字(M)标识。所以当C = F时,结果包含

A,B,M,D,E values

当C不在F中时,结果包含

A,B,M, null,null,null

当F不在C中时,结果包含

null,null,null,D,E,M

如何获得这个?

4 个答案:

答案 0 :(得分:1)

你在找这个吗?

SELECT A, B, D, E, COALESCE(C, F) M 
  FROM relation1 r1 FULL JOIN relation2 r2 
    ON r1.C = r2.F

假设为relation1:

|  A |  B | C |
---------------
| a1 | b1 | 1 |
| a2 | b2 | 2 |

和relation2:

|  D |  E | F |
---------------
| d1 | e1 | 1 |
| d3 | e3 | 3 |

输出

|      A |      B |      D |      E | M |
-----------------------------------------
|     a1 |     b1 |     d1 |     e1 | 1 |
|     a2 |     b2 | (null) | (null) | 2 |
| (null) | (null) |     d3 |     e3 | 3 |

这是 SQLFiddle 演示

答案 1 :(得分:0)

您可以在查询中使用别名,即C为M,F为M

答案 2 :(得分:0)

SELECT A,B,
  case when C is not null then M end,
  D,E,
  case when F is not null then M end
FROM relation1 r1 
  FULL JOIN relation r2 
ON r1.C=r2.F

除非M只是别名,否则

SELECT A,B,C as M, D,E, F as M
FROM relation1 r1 
  FULL JOIN relation r2 
ON r1.C=r2.F

答案 3 :(得分:0)

无法M列表中有SELECT(作为名称)两次。输出列名称必须是唯一的。

通常我希望@peterm's solutionCOALESCE()like I answered to your last question) 这是使用子查询和USING clause for the JOIN condition实现相同的另一种方法。

SELECT A, B, D, E, M 
FROM      (SELECT A, B, C AS M FROM relation1) r1
FULL JOIN (SELECT D, E, F AS M FROM relation2) r2 USING (M)