为什么这个简单的子查询不起作用?
我正在尝试编写一个简单的相关子查询,删除除最新的成员之外的所有成员的所有记录。为什么这个简单的子查询不起作用?
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个查询来完成工作。但很想知道这里出了什么问题?你能告诉我如何正确地写这个查询吗?
在此先感谢
尝试
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)
,并使用一些别名表:
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)
不会上班 - 发生错误是因为您在DELETE FROM表上没有别名 – 2012-03-29 05:41:25
当然,您是对的!我记得,很久以前我有过这样的问题;-) – Tobi 2012-03-29 05:44:37
尝试以下
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)
我试过这个,不应该给错误。 – chamara 2012-03-29 06:55:30
不,不应该,但你的建议是@John Dewey的完整副本。 – 2012-03-29 08:57:57
作为替代方案,你可以别名表子查询并引用外实例的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.
的列前缀,你肯定会引用外部表。
+1这是最合乎逻辑的方法:在理论上定位范围变量('别名')'p'的'DELETE'应该使基表不受影响,显然不是意图。 – onedaywhen 2012-03-29 08:36:55
谢谢。我认为别名外部表也是有意义的,至少当这个名字特别长时(而且一个特别懒):) – 2012-03-29 09:42:38
谢谢约翰..但是这不起作用..同名错误“不正确的语法附近'p'。” – Ananth 2012-03-29 06:30:16
@Ananth:在这个答案中*绝对*没有语法错误,它对我来说工作得非常好。将它应用于真实的桌面时,你一定错过了一些东西。 – 2012-03-29 08:55:33
@Andiry,约翰。查询工作得很好..这是我的坏..谢谢很多:) – Ananth 2012-03-29 09:18:46