2010-10-25 4 views
1

J'essaie de changer la requête suivante en une qui supprime les lignes retournées.postgreSQL sélectionne les travaux mais supprime pas

SELECT bad_rows.* 
FROM votes as bad_rows 
INNER JOIN(
    SELECT MIN(id) as min_id, votes.object_id, votes.user_id 
FROM votes WHERE is_archived=FALSE AND 
    votes.direction < 20 
GROUP BY votes.object_id, votes.user_id, votes.content_type_id 
having COUNT(votes.object_id) > 1 
) AS double_rows ON 
    double_rows.object_id = bad_rows.object_id 
    AND double_rows.user_id=bad_rows.user_id 
    AND bad_rows.is_archived=False 
    AND double_rows.min_id <> bad_rows.id 

cette sélection fonctionne et me donne les lignes que je veux supprimer. Maintenant, si je change la sélection en une suppression, ma requête ne fonctionne pas.

DELETE bad_rows.* 
FROM votes as bad_rows 
INNER JOIN(
    SELECT MIN(id) as min_id, votes.object_id, votes.user_id 
FROM votes WHERE is_archived=FALSE AND 
    votes.direction < 20 
GROUP BY votes.object_id, votes.user_id, votes.content_type_id 
having COUNT(votes.object_id) > 1 
) AS double_rows ON 
    double_rows.object_id = bad_rows.object_id 
    AND double_rows.user_id=bad_rows.user_id 
    AND bad_rows.is_archived=False 
    AND double_rows.min_id <> bad_rows.id 

ERREUR: erreur de syntaxe à ou près de "bad_rows" LINE 1: SUPPRIMER bad_rows *

Répondre

3

Vous ne pouvez pas spécifier des colonnes à supprimer

également,. (La * en bad_rows.*.) la plupart des bases de données ne vous permettent pas de spécifier un alias à supprimer. Donc, l'approche habituelle à la suppression est quelque chose comme:

DELETE VOTES 
WHERE ID IN 
     (
     <subquery selecting the ID's of the rows you want to delete> 
     ) 
0

En utilisant le conseil d'Andomar, je l'ai fait fonctionner.

DELETE FROM votes WHERE id IN (
SELECT bad_rows.id 
FROM votes as bad_rows 
INNER JOIN(
SELECT MIN(id) as min_id, votes.object_id, votes.user_id 
FROM votes where is_archived=FALSE and votes.direction < 20 

GROUP BY votes.object_id, votes.user_id, votes.content_type_id 
having COUNT(votes.object_id) > 1 
) as double_rows on double_rows.object_id = bad_rows.object_id and double_rows.user_id=bad_rows.user_id and bad_rows.is_archived=False 
    and double_rows.min_id <> bad_rows.id 
) 
Questions connexes