Sql server 删除中不存在的位置
我有一个简单的问题。我从以下SQL中得到一个语法错误:Sql server 删除中不存在的位置,sql-server,tsql,Sql Server,Tsql,我有一个简单的问题。我从以下SQL中得到一个语法错误: DELETE FROM Blog.Category c WHERE NOT EXISTS (SELECT * FROM Blog.Posts p WHERE p.postCategory = blog.Category.catId) 很明显我错过了一些愚蠢的事情。如有任何提示,将不胜感激 编辑 我也试过了 DELETE FROM Blog.Category c where NOT EXISTS(SE
DELETE FROM Blog.Category c
WHERE NOT EXISTS (SELECT * FROM Blog.Posts p
WHERE p.postCategory = blog.Category.catId)
很明显我错过了一些愚蠢的事情。如有任何提示,将不胜感激
编辑
我也试过了
DELETE FROM Blog.Category c
where NOT EXISTS(SELECT * FROM Blog.Posts p WHERE p.postCategory = c.catId)
不管我得到什么
靠近“c”的语法不正确
请尝试以下查询,我认为它与alias有关:
DELETE FROM Blog.Category c
WHERE NOT EXISTS (SELECT * FROM Blog.Posts p
WHERE p.postCategory = c.catId);
我更喜欢更新和删除alias的表,因为我觉得它更清晰
DELETE c
FROM Blog.Category c
left join Blog.Posts p ON p.postCategory = c.catId
WHERE p.postCategory IS NULL
查询中的问题是您为表添加了别名,然后在EXISTS中不使用它。这里的主题相同
在SQL Server中,使用“不存在”时,需要为要连接的表设置别名,并在delete语句中指定要从中删除行的表
您在
DELETE
语句之后直接缺少别名
DELETE c FROM Blog.Category c
WHERE NOT EXISTS(SELECT * FROM Blog.Posts p WHERE p.postCategory = c.catId)
或者,您可以省略别名并使用完整的表名
DELETE FROM Blog.Category
WHERE NOT EXISTS(SELECT * FROM Blog.Posts p WHERE p.postCategory = Blog.Category.catId)
blog.Category.catId
似乎不适合这里。。。。blog
是架构还是您将其别名错了,它应该是c.catId
,因为这是基本表的别名连接速度更快?我觉得这需要一些证据,因为通常情况并非如此afaik@JoePhillips在小数据集中,它是可以忽略不计的。我刚刚创建了一个小示例,在两个表中包含50000和100000条记录,并交替运行了10次。连接平均为3毫秒,不存在平均为7.5毫秒。我认为如果使用更广泛的连接,可能会得到不同的结果tables@JoePhillips现在正在加载一个100倍于原始大小的数据集。只是等待它完成:)删除了关于连接速度更快的部分。我很可能在考虑附属选择。随后对5mil和10mil表大小进行的测试表明,if-exists大约占连接时间的60%。