我有三个具有以下结构的表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给我一个错误,提示elements.direction should be in group by
。而且在group_by中包含elements.direction
并不能使我在path.id
级别进行聚合。
坚持下去。有人可以帮忙吗? 我正在使用Postgres 9.5版
答案 0 :(得分:2)
您需要聚合。这是一种方法:
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