要通过加入删除,我们使用此格式
DELETE t1,t2 FROM t1
INNER JOIN
t2 ON t2.ref = t1.id
WHERE
t1.id = 1;
来自www.mysqltutorial.org/mysql-delete-join
遵循确切的删除方法,但是当我在自己的版本中实现时,在要删除的两个表之间的逗号中出现错误。
这就是我所拥有的:
在上图中看到了我的实现和出现的错误。
任何想法都值得赞赏
Update
stackoverflow.com/questions/16481379/how-to-delete-using-inner-join-with-sql-server格式
答案 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