为什么这个简单的子查询不起作用?

时间:2012-03-29 05:03:45

标签: sql sql-server sql-server-2008

我正在尝试编写一个简单的相关子查询,删除除最新成员之外的所有成员的所有记录。

DELETE FROM table1  p
WHERE member_id IN (1, 2,3)
AND create_dttm < (SELECT MAX(create_dttm) 
                   FROM table1   
                   WHERE  member_id = p.member_id)

但我收到错误消息

  

'p'附近的语法不正确。

我可以轻松编写3个查询来完成工作。但很想知道这里出了什么问题?能否请您告诉我如何正确编写此查询?

提前致谢

4 个答案:

答案 0 :(得分:2)

尝试

DELETE p
FROM table1  p
WHERE member_id IN (1, 2,3)
AND create_dttm < (SELECT MAX(create_dttm) 
                   FROM table1   
                   WHERE  member_id = p.member_id)

答案 1 :(得分:2)

作为替代方案,您可以在子查询中对表进行别名,并通过表的真实名称引用外部实例的member_id

DELETE FROM table1
WHERE WHERE member_id IN (1, 2,3)
AND create_dttm < (SELECT MAX(create_dttm) 
                   FROM table1 p
                   WHERE  table1.member_id = p.member_id)

在SQL Server中,为表分配别名时,不能再在同一语句中按原始名称引用该表。因此,在子查询中使用table1.前缀列前缀,您肯定会引用外部表。

答案 2 :(得分:1)

并为表格使用一些别名:

DELETE FROM table1 p
WHERE p.member_id IN (1, 2,3)
AND p.create_dttm < (SELECT MAX(p1.create_dttm) 
                   FROM table1 p1 
                   WHERE p1.member_id = p.member_id)

答案 3 :(得分:1)

尝试以下

DELETE p FROM table1 p
WHERE member_id IN (1, 2,3)
AND create_dttm < (SELECT MAX(create_dttm) 
                   FROM table1   
                   WHERE  member_id = p.member_id)