Полное внешнее соединение в postgres - PullRequest
0 голосов
/ 10 мая 2018

У меня есть следующая таблица в 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 голосов
/ 10 мая 2018

Вам нужен FULL OUTER JOIN ( см. Руководство здесь ).
А поскольку вы не можете использовать фильтр WHERE из-за потенциальных значений NULL, вам необходимо предварительно отфильтровать 2 набора данных, используя CTE s ( см. Руководство здесь ).

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 и укажите значения по умолчанию для любого типа данных, который вы используете.

...