使用代码点火器上的join删除MSSQL会返回错误

时间:2019-02-07 05:20:37

标签: sql-server codeigniter inner-join sql-delete

要通过加入删除,我们使用此格式

DELETE t1,t2 FROM t1
        INNER JOIN
    t2 ON t2.ref = t1.id 
WHERE
    t1.id = 1;

来自www.mysqltutorial.org/mysql-delete-join

遵循确切的删除方法,但是当我在自己的版本中实现时,在要删除的两个表之间的逗号中出现错误。

这就是我所拥有的:

image

在上图中看到了我的实现和出现的错误。

任何想法都值得赞赏

Update

stackoverflow.com/questions/16481379/how-to-delete-using-inner-join-with-sql-server格式

2 个答案:

答案 0 :(得分:0)

SQL Server只允许DELETE语句中的一个表DELETE

在这种情况下,您试图在单个DELETE语句中从两个表中删除记录,这是不允许的。

对于您的情况,您可以像下面这样简单地编写相同的查询。

DELETE FROM lngFileId 
WHERE lngId=5

DELETE FROM tbl_FileOrPath
WHERE lngFileId=5

对于更复杂的情况,您可以尝试以下操作。

DECLARE @TABLE TABLE 
  ( 
     id INT 
  ) 

INSERT INTO @TABLE 
SELECT t1.ID 
FROM   t1       
WHERE  <YOUR_CONDITION>

DELETE T 
FROM   t1 T 
WHERE  EXISTS (SELECT 1 
               FROM   @TABLE T2 
               WHERE  T2.id = T.id) 

DELETE T 
FROM   t2 T 
WHERE  EXISTS (SELECT 1 
               FROM   @TABLE T2 
               WHERE  T2.id = T.ref) 

另一种情况可能是您在启用Foreign Key的表之间具有ON DELETE CASCADE关系。在这种情况下,您只需要从父表中删除,子表记录将被自动删除。

答案 1 :(得分:-1)

您需要为要删除的表设置别名,如下例所示,因为w用于WorkRecord2。需要时,需要使用内部联接delete或update语句。

DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
  ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'

也只能删除一个表。在MySQL中(而不是MSSQL)允许删除多个表。您可以找到实时演示Here

下面是带有示例数据的查询。

create table WorkRecord2 (EmployeeRun int, empWorkNo varchar(10))
create table Employee (EmployeeNo int, empWorkNo varchar(10), company int, createdDate datetime)

insert into WorkRecord2 Values (1, 'EMW101'),(2, 'EMW102'),(3, 'EMW103'),(4, 'EMW104'),(5, 'EMW105')
insert into Employee values(1, 'EMW101', 1, GETDATE()),(2, 'EMW103', 2, GETDATE())

Select * from WorkRecord2
Select * from Employee

-- This will delete with employeeRun 1 and empWorkNo EMW101
DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
  ON EmployeeRun=EmployeeNo
WHERE Company = 1 and Cast(createdDate as DATE) = Cast(GETDATE() as DATE)

Select * from WorkRecord2
Select * from Employee

删除表数据之前,如下所示。

EmployeeRun empWorkNo
---------------------
1           EMW101
2           EMW102
3           EMW103
4           EMW104
5           EMW105

使用内部联接删除后,表数据如图所示。

EmployeeRun empWorkNo
---------------------
2           EMW102
3           EMW103
4           EMW104
5           EMW105