Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用内部联接删除TSQL_Sql Server_Tsql - Fatal编程技术网

Sql server 使用内部联接删除TSQL

Sql server 使用内部联接删除TSQL,sql-server,tsql,Sql Server,Tsql,以下SQL语句在我的数据库上执行良好: SELECT * FROM tblKPIs AS k INNER JOIN tblKeyPointLinks AS l ON k.KPIID = l.KPIID INNER JOIN tblKeyPoints AS p ON p.KptID = l.KptID INNER JOIN tblHistory AS h ON h.HistoryID = p.HistoryID WHERE h.CaseNo = 50043; 然而,等效的Delete语句

以下SQL语句在我的数据库上执行良好:

SELECT * FROM tblKPIs AS k 
INNER JOIN tblKeyPointLinks AS l ON k.KPIID = l.KPIID 
INNER JOIN tblKeyPoints AS p ON p.KptID = l.KptID 
INNER JOIN tblHistory AS h ON h.HistoryID = p.HistoryID 
WHERE h.CaseNo = 50043;
然而,等效的Delete语句给出了一个错误“语法接近于”

DELETE FROM tblKPIs AS k 
INNER JOIN tblKeyPointLinks AS l ON k.KPIID = l.KPIID 
INNER JOIN tblKeyPoints AS p ON p.KptID = l.KptID 
INNER JOIN tblHistory AS h ON h.HistoryID = p.HistoryID 
WHERE h.CaseNo = 50043;
我不能在Delete语句中使用联接吗

如果没有,我如何执行上述删除

编辑

表tblKeyPointLinks是在TBLKPI和tblKeyPoints之间建立多对多关系的中间表。因此,SELECT语句多次返回TBLKPI中的某些条目。这就是DELETE语句可能出现问题的原因吗?解决这个问题的最佳方法是什么?

您可以:

DELETE FROM tblKPIs 
  WHERE id in (
    SELECT id 
      FROM tblKPIs AS k 
      INNER JOIN tblKeyPointLinks AS l ON k.KPIID = l.KPIID 
      INNER JOIN tblKeyPoints AS p ON p.KptID = l.KptID 
      INNER JOIN tblHistory AS h ON h.HistoryID = p.HistoryID 
      WHERE h.CaseNo = 50043)

是,您可以加入删除语句:

DELETE k FROM tblKPIs AS k 
INNER JOIN tblKeyPointLinks AS l ON k.KPIID = l.KPIID 
INNER JOIN tblKeyPoints AS p ON p.KptID = l.KptID 
INNER JOIN tblHistory AS h ON h.HistoryID = p.HistoryID 
WHERE h.CaseNo = 50043;

成功的代码如下:

DELETE k
FROM tblKPIs k  
     INNER JOIN tblKeyPointLinks l ON k.KPIID = l.KPIID
     INNER JOIN tblKeyPoints p ON p.KptID = l.KptID
     INNER JOIN tblHistory h ON h.HistoryID = p.HistoryID
WHERE h.CaseNo = 50043; 
显然
DELETE
语句不喜欢使用关键字
AS

只需将
作为
关键字省略,语句就可以正常工作。

现在返回错误“多部分标识符k.KPIID无法绑定”,我认为这是错误的,因为您的示例中有一个输入错误。KPIID是tblKPIs中的一列吗?我同意@BrianDishaw的观点。听起来你想加入一个不存在的专栏…没有打字错误。KPIID是tblKPIs中的主键。也不是在原来的帖子中,我说如果前面加了SELECT而不是DELETE,那么完全相同的语句也会起作用。还返回错误“多部分标识符k.KPIID无法绑定”。我认为这是错误的,因为您的示例中有一个输入错误。KPIID是tblKPIs中的一列吗?SQL的哪个版本?语法各不相同。这与Igor的解决方案相同。唯一的区别是,他的别名前包含
AS
。是的,我知道——我想我也这么说了——这真的证明我的解决方案是正确的吗?对不起,我不知道你在说什么。如果你是说有人否决了你的答案,那不是我。不管怎么说,我现在明白了,你的答案没有被否决票,所以也许你的意思是别的。