Попытка GROUP BY с делом, когда потом - postgresql - PullRequest
0 голосов
/ 02 июля 2018

У меня есть три таблицы PATH, ELEMENTS и ELEMENT_DETAILS со следующей структурой:

ПУТЬ:

ID
1
2
3

ЭЛЕМЕНТОВ:

ID | PATH_ID | DIRECTION | ELEMENT_DETAILS_ID
1    1         'left'      1
2    1         'right'     2
3    2         'left'      3
4    2         'right'     2

ELEMENT_DETAILS:

ID | NAME
1    'Henry'
2    'Mark'
3    'John'

Я бы хотел, чтобы результат был таким:

ID  | left    |   right
1    'Henry'      'Mark'
2    'John'       'Mark'

Это SQL, который я придумал до сих пор:

      SELECT path.id, 
             CASE WHEN elements.direction='left' THEN element_details.name
             ELSE NULL END
            as left,
             CASE WHEN elements.direction='right' THEN element_details.name
             ELSE NULL END
            as right,
      FROM elements
      INNER JOIN path on elements.path_id = path.id
      LEFT JOIN element_details on elements.element_details_id = element_details.id
      GROUP BY path.id
      ORDER BY path.id

Однако это не работает, так как postgres выдает ошибку «1021». И включение elements.direction в group_by не дает мне агрегацию на уровне path.id.

Застрял в этом. Может кто-нибудь, пожалуйста, помогите. Я использую Postgres версии 9.5

1 Ответ

0 голосов
/ 02 июля 2018

Вам нужна агрегация. Вот один из методов:

SELECT p.id, 
       MAX(CASE WHEN e.direction = 'left' THEN ed.name
           END) as left,
       MAX(CASE WHEN e.direction = 'right' THEN ed.name
           END) as right
FROM elements e INNER JOIN
     path p
     ON e.path_id = p.id LEFT JOIN
     element_details ed
     ON e.element_details_id = ed.id
GROUP BY p.id
ORDER BY p.id
...