2010-10-25 84 views
1

我试图改变以下查询到一个删除返回的行。PostgreSQL的选择工作,但删除不

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 

此选择工作,并给我我想要删除的行。现在,如果我将选择更改为删除,我的查询不起作用。

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 

错误:在语法错误或接近 “bad_rows” LINE 1:删除bad_rows *

回答

3

您不能指定删除列

另外,(在bad_rows.**)。大多数数据库不允许您指定要删除的别名。所以通常删除的方法是这样的:

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

使用Andomar的建议我得到它的工作。

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 
)