Sql 连接三个表,产生重复的记录

Sql 连接三个表,产生重复的记录,sql,postgresql,join,Sql,Postgresql,Join,下面的查询几乎是正确的,只不过它会导致list_taxonomies表中的重复行。我只需要list_taxonomies表中唯一的行。我一直在努力寻找一些解决方案,但似乎没有找到。我在items表上尝试了左外部和内部联接 谢谢你的帮助 查询: SELECT lists.*, json_agg(items ORDER BY items.id) AS _items, json_agg(list_taxonomies ORDER BY list_taxonomies.ty

下面的查询几乎是正确的,只不过它会导致list_taxonomies表中的重复行。我只需要list_taxonomies表中唯一的行。我一直在努力寻找一些解决方案,但似乎没有找到。我在items表上尝试了左外部和内部联接

谢谢你的帮助

查询:

SELECT 
    lists.*, 
    json_agg(items ORDER BY items.id) AS _items, 
    json_agg(list_taxonomies ORDER BY list_taxonomies.type) AS taxonomy 
FROM 
    lists 
JOIN 
    list_taxonomies ON list_taxonomies.list_id = lists.id 
JOIN 
    items ON items.list_id = lists.id  
WHERE 
    lists.id = 3 
GROUP BY 
    lists.id
当前结果:

{
    "status": "success",
    "data": [{
        "id": 3,
        "name": "tincidunt pede ac urna. Ut",
        "description": "Lorem ipsum dolor sit amet, consectetuer adipiscing",
        "created": "2016-08-24T12:00:00.000Z",
        "updated": "2016-08-24T12:00:00.000Z",
        "owner": 9,
        "likes": 3,
        "private": 0,
        "location": "United States",
        "nsfw": 0,
        "_items": [{
            "id": 2,
            "name": "sem semper",
            "description": "sollicitudin commodo",
            "list_id": 3,
            "type": 2,
            "image": "http://fillmurray.com/",
            "list_order": 6,
            "created": "2016-08-24T05:00:00-07:00",
            "link": "http://amazon.com"
        }, {
            "id": 14,
            "name": "magna sed",
            "description": "bibendum. Donec felis",
            "list_id": 3,
            "type": 2,
            "image": "http://fillmurray.com/",
            "list_order": 1,
            "created": "2016-08-24T05:00:00-07:00",
            "link": "http://google.com"
        }],
        "taxonomy": [{
            "list_id": 3,
            "taxonomy": "Art",
            "type": 1
        }, {
            "list_id": 3,
            "taxonomy": "Art",
            "type": 1
        }, {
            "list_id": 3,
            "taxonomy": "Art",
            "type": 1
        }, {
            "list_id": 3,
            "taxonomy": "Art",
            "type": 1
        }, {
            "list_id": 3,
            "taxonomy": "Art",
            "type": 1
        }, {
            "list_id": 3,
            "taxonomy": "Art",
            "type": 1
        }, {
            "list_id": 3,
            "taxonomy": "Art",
            "type": 1
        }]
    }],
    "message": "Retrieved list 1"
}

从多个表聚合时,请在加入前聚合:

SELECT 
  l.*, 
  i._items, 
  lt.taxonomy 
FROM lists l
JOIN
(
  select list_id, json_agg(list_taxonomies.* order by type) AS taxonomy
  from list_taxonomies
  group by list_id
) lt ON lt.list_id = l.id 
JOIN 
(
  select list_id, json_agg(items.* order by id) AS _items
  from items
  group by list_id
) i ON i.list_id = l.id  
WHERE l.id = 3;

从多个表聚合时,请在加入前聚合:

SELECT 
  l.*, 
  i._items, 
  lt.taxonomy 
FROM lists l
JOIN
(
  select list_id, json_agg(list_taxonomies.* order by type) AS taxonomy
  from list_taxonomies
  group by list_id
) lt ON lt.list_id = l.id 
JOIN 
(
  select list_id, json_agg(items.* order by id) AS _items
  from items
  group by list_id
) i ON i.list_id = l.id  
WHERE l.id = 3;

用左手试试JOIN@McNets我试过了,同样的结果。应该是分类内的项目?因为双左连接应该有效。@McNets分类法应该在数据内部,而不是在项目内部。返回的数据的结构如上所述是正确的。请使用LEFT重试JOIN@McNets我试过了,同样的结果。应该是分类内的项目?因为双左连接应该有效。@McNets分类法应该在数据内部,而不是在项目内部。返回数据的结构如上所述是正确的。这对我来说是有意义的,但是查询失败了,因为_items实际上不是items中的列。不,它不是。它是项目上json聚合的别名。我看不出有什么瑕疵。也许它需要是
items
或`items.*`而不是
json\u agg(*order by id)
中的
*
?您收到的确切错误消息是什么?我收到的
\u项不存在。你说得对,是*本身造成了错误。一旦我改变了这一点,它就是对的。谢谢这对我来说是有意义的,但是查询失败了,因为_items实际上不是items中的列。不,它不是。它是项目上json聚合的别名。我看不出有什么瑕疵。也许它需要是
items
或`items.*`而不是
json\u agg(*order by id)
中的
*
?您收到的确切错误消息是什么?我收到的
\u项不存在。你说得对,是*本身造成了错误。一旦我改变了这一点,它就是对的。谢谢