SQL加入到最匹配的行

时间:2010-06-18 02:23:22

标签: postgresql denormalization

我有一个wiki系统,其中有一个中心表Article,它在自己的表中有许多修订版。每个修订包含created_at时间和日期列。

我想更新文章以包含最新修订版名称字段中的非规范化字段sort_name。

我可以发出什么SQL命令来填写每个Article的sort_name字段及其最新版本的名称字段?

对于它的价值,我在PostgreSQL上。

3 个答案:

答案 0 :(得分:2)

不是100%肯定PostgreSQL语法,所以你可能需要稍微改变一下,但想法是:

UPDATE Articles
SET sort_name = (SELECT FIRST(name)
                 FROM Revisions
                 WHERE Revisions.id = Articles.id
                 ORDER BY created_at DESC)

答案 1 :(得分:1)

如果我理解正确,您想加入最新版本。以下是选择最新修订版以进行更新的优化方法。如果这不是你想要的,请告诉我。它是为T-SQL编写的,因为我不熟悉PostgreSQL

UPDATE ARTICLES
SET SORT_NAME = lastHist.NAME
FROM ARTICLES AS t
    --Join the the most recent history entries
        INNER JOIN  REVISION lastHis ON t.ID = lastHis.FK_ID
        --limits to the last history in the WHERE statement
            LEFT JOIN REVISION his2 on lastHis.FK_ID = his2.FK_ID and lastHis.CREATED_TIME < his2.CREATED_TIME
WHERE his2.ID is null

答案 2 :(得分:1)

表格结构有助于更好地定义您的问题。

对于Postgres:

UPDATE ARTICLES ar
SET sort_name = (SELECT name FROM Revisions rev 
                 WHERE rev.article_id = ar.article_id
                 ORDER BY rev.createdate DESC LIMIT 1)