2010-06-18 16 views
1

J'ai un système wiki où il y a une table centrale, Article, qui a de nombreuses révisions dans leur propre table. Les révisions contiennent chacune une colonne date et heure created_at.SQL pour rejoindre la meilleure ligne correspondante

Je souhaite mettre à jour les articles pour qu'ils contiennent un champ denormalized sort_name dans le champ Nom de la révision le plus récent.

Quelle commande SQL puis-je lancer pour remplir le champ nom_de_table de chaque article avec son champ Nom de la révision le plus récent?

Pour ce que ça vaut, je suis sur PostgreSQL.

+0

Plutôt que de faire ce un problème total de mots, vous seriez bien mieux nous montrer quelques tables de ascii ou des déclarations de création. Vous êtes également beaucoup plus susceptible d'obtenir quelque chose d'utile. –

Répondre

1

La structure de la table aiderait à mieux définir votre problème.

Pour 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) 
2

Non 100% que la syntaxe PostgreSQL, de sorte que vous pourriez avoir à changer cela un peu, mais l'idée est la suivante:

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

Si je vous comprends bien, vous voulez joindre à la révision la plus récente. Voici une façon optimisée de sélectionner la révision la plus récente pour effectuer la mise à jour. Faites-moi savoir si ce n'était pas ce que vous cherchiez. Il est écrit pour T-SQL puisque je ne suis pas familier avec 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