Postgresql 基于少量子查询的复杂插入

Postgresql 基于少量子查询的复杂插入,postgresql,postgresql-9.3,Postgresql,Postgresql 9.3,我有以下表格: Posts: id, CategoryId PostAssociations: PostId FK Posts(id), AssociatedPostId FK Posts(id) 因此,每个职位可能有许多其他职位作为相关职位 我需要的是: 对于每个还没有任何相关职位的职位p,从同一类别中随机添加4个相关职位(不包括职位p-不应该与他自己相关) 到目前为止我有 # SELECT Posts that don't have any associated posts yet SEL

我有以下表格:

Posts: id, CategoryId
PostAssociations: PostId FK Posts(id), AssociatedPostId FK Posts(id)
因此,每个职位可能有许多其他职位作为相关职位

我需要的是:

对于每个还没有任何相关职位的职位p,从同一类别中随机添加4个相关职位(不包括职位p-不应该与他自己相关)

到目前为止我有

# SELECT Posts that don't have any associated posts yet
SELECT p.id
FROM "Posts" p
LEFT OUTER JOIN "PostAssociations" pa ON pa."PostId" = p.id
WHERE pa."PostId" IS NULL
以及:

我需要这样的查询:

INSERT INTO "PostAssociations" VALUES ...


SQL摆弄着解释我需要什么:

当你用postgresql-9.3标记帖子时,我想使用
LATERAL
在所有缺少关联的id上应用随机id生成查询应该是可行的。(这在功能上应该类似于对MS SQL使用
OUTER APPLY

(显示之前、插入和之后)

我不能声称自己是Postgresql的专家,因此很可能可以改进查询

INSERT INTO "PostAssociations" VALUES ...
INSERT INTO PostAssociations
SELECT 
  p.id, rand.id rand
FROM Posts p
LEFT OUTER JOIN PostAssociations pa ON pa.PostId = p.id
LEFT JOIN LATERAL
(
  SELECT id 
  FROM Posts
  WHERE CategoryId = p.categoryid AND id != p.id
  ORDER BY RANDOM()
LIMIT 4) AS rand ON TRUE
WHERE pa.PostId IS NULL;