查询具有复杂关系的多个表

时间:2013-01-25 17:37:33

标签: sql postgresql

我想要的查询超出了我的SQL知识,所以我希望在这里得到一些帮助。我希望从postgreSQL 9.2中的多个表中获得相关性。我知道程序,但我不知道SQL。

此查询中有4个表:

  • wishlist:与一个或多个列表相关联,并且首选商店
  • list_wishlist:保存列表与愿望清单之间的关系
  • item 与列表相关联并且首选商店
  • prefered_stores:这保存了商店和首选商店之间的关系(每个首选商店都是一个单独的行 prefered_store。因此,如果项目或心愿单有多个 首选商店,prefered_store.id对于那些行是相同的)

这些表看起来像这样(删除了不相关的列): enter image description here

以下是结果表的外观: enter image description here

让我解释一下结果表:

  • item_id:就是那个项目的ID
  • item_stores_comments:商店/评论 来自与此项关联的所有prefered_stores行的对(以逗号分隔的商店/评论和以分号分隔的对)
  • wishlist_stores:存储相关联的所需列出的愿望清单的ID 包含此项目所在的列表(以逗号分隔)

我已经在item_info表中填写了上面示例表的实际结果,所以我想它应该很清楚,但如果你没有得到什么,请告诉我。

我按照评论中的建议创建了一个SQLFiddle:http://sqlfiddle.com/#!12/9fd60 它包含与图像中相同的模式和值。

1 个答案:

答案 0 :(得分:3)

这应该做你想要的:

WITH a AS (
  SELECT item.id, string_agg(prefered_store.store::varchar, ',') wishlist_stores
  FROM item, list_wishlist, wishlist, prefered_store
  WHERE item.list=list_wishlist.list
    AND list_wishlist.wishlist=wishlist.id
    AND wishlist.prefered_stores=prefered_store.id
  GROUP BY item.id
), b AS (
  SELECT item.id, 
    string_agg(
      prefered_store.store::varchar || ',' || prefered_store.comment,
      ' ; ') item_stores_comments
    FROM item, prefered_store
    WHERE item.prefered_stores=prefered_store.id
    GROUP BY item.id
)
SELECT a.id,item_stores_comments,wishlist_stores 
FROM a,b
WHERE a.id=b.id