2012-03-29 130 views
2

我正在尝试编写一个简单的相关子查询,删除除最新的成员之外的所有成员的所有记录。为什么这个简单的子查询不起作用?

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个查询来完成工作。但很想知道这里出了什么问题?你能告诉我如何正确地写这个查询吗?

在此先感谢

回答

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) 
+0

谢谢约翰..但是这不起作用..同名错误“不正确的语法附近'p'。” – Ananth 2012-03-29 06:30:16

+1

@Ananth:在这个答案中*绝对*没有语法错误,它对我来说工作得非常好。将它应用于真实的桌面时,你一定错过了一些东西。 – 2012-03-29 08:55:33

+0

@Andiry,约翰。查询工作得很好..这是我的坏..谢谢很多:) – Ananth 2012-03-29 09:18:46

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) 
+1

不会上班 - 发生错误是因为您在DELETE FROM表上没有别名 – 2012-03-29 05:41:25

+0

当然,您是对的!我记得,很久以前我有过这样的问题;-) – Tobi 2012-03-29 05:44:37

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) 
+0

我试过这个,不应该给错误。 – chamara 2012-03-29 06:55:30

+0

不,不应该,但你的建议是@John Dewey的完整副本。 – 2012-03-29 08:57:57

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.的列前缀,你肯定会引用外部表。

+0

+1这是最合乎逻辑的方法:在理论上定位范围变量('别名')'p'的'DELETE'应该使基表不受影响,显然不是意图。 – onedaywhen 2012-03-29 08:36:55

+0

谢谢。我认为别名外部表也是有意义的,至少当这个名字特别长时(而且一个特别懒):) – 2012-03-29 09:42:38

相关问题