postgres中的全外连接

时间:2018-05-10 10:26:22

标签: postgresql join union outer-join full-outer-join

我在Postgresql中有以下表格:

sch_code   sch_level   start_date   end_date      flag
1234          P        01-01-2018   31-01-2018    V
1234          S        01-01-2018   31-01-2018    V
5678          S        01-01-2018   31-01-2018    V
8965          P        01-01-2018   31-01-2018    V

我要求的结果如下。

sch_code    start_P         end_P     start_S     end_S
1234        01-01-2018   31-01-2018   01-01-2018   31-01-2018  
5678        00-00-0000   00-00-0000   01-01-2018   31-01-2018  
8965        01-01-2018   31-01-2018   00-00-0000   00-00-0000  

我尝试使用UNION的查询未提供结果。我也尝试过使用循环选择语句。

1 个答案:

答案 0 :(得分:0)

您需要FULL OUTER JOINsee guide here) 由于潜在WHERE值导致您无法使用NULL过滤器,因此您必须使用CTE s(see guide here)预过滤2个数据集

WITH pdata AS (
  SELECT * FROM mytable WHERE sch_level='P'
),
sdata AS (
  SELECT * FROM mytable WHERE sch_level='S'
)
SELECT
  COALESCE(pdata.sch_code, sdata.sch_code) AS sch_code,
  pdata.start_date AS start_P,
  pdata.end_date   AS end_P,
  sdata.start_date AS start_S,
  pdata.end_date   AS end_S
FROM pdata
FULL OUTER JOIN sdata ON pdata.sch_code = sdata.sch_code

如果您不想在日期字段中显示NULL值,只需使用COALESCE并在您可能使用的任何数据类型中提供默认值。