Postgresql关系加入



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

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

如何得到这个?

你在找这个吗?

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

假设关系1:

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

和关系2:

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

输出将为

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

这是SQLFiddle演示

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

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

M(作为名称)不可能在SELECT列表中出现两次。输出列名必须是唯一的。

一般来说,我更喜欢@peterm的COALESCE()解决方案(就像我回答了你最后一个问题一样)
这里有另一种方法可以通过子查询和JOIN条件的USING子句来实现相同的目的。

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)

最新更新