基于少数子查询的复杂插入

时间:2014-09-20 09:57:32

标签: 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
SELECT p.id
FROM "Posts" p
LEFT OUTER JOIN "PostAssociations" pa ON pa."PostId" = p.id
WHERE pa."PostId" IS NULL

# SELECT 4 random posts from given category and excluding given id
SELECT id 
FROM "Posts" p2
WHERE p2."CategoryId" = ? AND p2.id != ?
ORDER BY RANDOM()
LIMIT 4

我需要这样的查询:

INSERT INTO "PostAssociations" VALUES ...

SQL解释我需要什么:http://sqlfiddle.com/#!2/6ba735/5

1 个答案:

答案 0 :(得分:1)

当您使用postgresql-9.3标记帖子时,我想使用LATERAL将随机ID生成查询应用于所有缺少关联的ID应该起作用。 (这应该在功能上类似于使用OUTER APPLY和MS SQL)。

Sample SQL Fiddle(显示之前,插入和之后)。

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;

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