如何在SQL Server中使用INNER JOIN删除?


1283

我想INNER JOINSQL Server 2008中删除使用。

但是我得到这个错误:

消息156,级别15,状态1,第15行
关键字“ INNER”附近的语法错误。

我的代码:

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

2
文档中的示例C 显示了如何DELETE
联接

1
示例C也使用了一个游标和一堆无关的东西
reggaeguitar

从t1.id = t2.id上的table1 t1内部联接table2 t2中的table1中删除;详细信息youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Answers:


2241

您需要指定要删除的表,这是带有别名的版本:

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

9
@bluefeet您能为SQL Server提供正确的语法以从两个表中删除吗?
oabarca 2014年

44
@ user2070775在SQL Server中,要从2个表中删除,您需要使用2个单独的语句。
塔林

8
@ user2070775在SQL Server中,您可以使用事务和伪表,如stackoverflow.com/questions/783726/…
Mathieu Rodic 2014年

1
@MathieuRodic感谢您的分享。在我的设置中,如果我分别从2个表中删除,我真的不再知道要从第二个表中删除哪些行,因此这将有所帮助:)
Verena Haunschmid

2
@ShahryarSaljoughi是WorkRecord2表的别名。
Taryn

151

只需添加的表名DELETE,并FROM从那里你要删除的记录,因为我们必须指定表中删除。还要删除ORDER BY子句,因为删除记录时不需要排序。

因此,您的最终查询应如下所示:

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

3
如果您只打算从第一个表中删除,则此选项在SQL Server上有效。
TroySteven

1
@matwonk:如果使用第二张表的名称,则可以从第二张表删除。例如,使用DELETE Employee将从员工的表而不是WorkRecord2表中删除。
hims056

1
@matwonk:这是一个示例:1)从第一个表中删除 2)从第二个表中删除
hims056 '19

30

可能对您有帮助-

DELETE FROM dbo.WorkRecord2 
WHERE EmployeeRun IN (
    SELECT e.EmployeeNo
    FROM dbo.Employee e
    WHERE ...
)

或者尝试一下-

DELETE FROM dbo.WorkRecord2 
WHERE EXISTS(
    SELECT 1
    FROM dbo.Employee e
    WHERE EmployeeRun = e.EmployeeNo
        AND ....
)

1
这是在Sql Server上起作用的唯一答案。只需构建您的查询,例如从...中选择Id ... join ... join等,然后将其包装为子查询,然后从(表)中的(子查询)Id中删除即可
Chris Moschini 2015年


16

它应该是:

DELETE zpost 
FROM zpost 
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"       

11

这个版本应该工作

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

11

在SQL Server Management Studio中,我可以轻松创建SELECT查询。

SELECT Contact.Naam_Contactpersoon, Bedrijf.BedrijfsNaam, Bedrijf.Adres, Bedrijf.Postcode
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf

我可以执行它,并显示所有联系人。

现在将更SELECT改为DELETE

DELETE Contact
FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf

您在 SELECT语句中将被删除。

您甚至可以使用相同的过程创建更困难的内部联接,例如:

DELETE FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
INNER JOIN LoginBedrijf ON Bedrijf.IDLoginBedrijf = LoginBedrijf.IDLoginBedrijf


9

试试这个查询:

DELETE WorkRecord2, Employee 
FROM WorkRecord2 
INNER JOIN Employee ON (tbl_name.EmployeeRun=tbl_name.EmployeeNo)
WHERE tbl_name.Company = '1' 
AND tbl_name.Date = '2013-05-06';

8
我很确定DELETE只能指定一个表。这对我不起作用。
Stealth Rabbi 2015年

3
我相信您可以在mySQL中指定多个要删除的表,但不能指定SQL Server(该问题会问)。
dandev91

7

使用的另一种方式CTE

;WITH cte 
     AS (SELECT * 
         FROM   workrecord2 w 
         WHERE  EXISTS (SELECT 1 
                        FROM   employee e 
                        WHERE  employeerun = employeeno 
                               AND company = '1' 
                               AND date = '2013-05-06')) 
DELETE FROM cte 

注意:如果需要,我们不能JOIN在内部使用。CTEdelete


6

这是一次简单的查询,可以一次从两个表中删除记录。

DELETE table1.* ,
       table2.* 
FROM table1 
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'

2
这个问题是针对SQL Server的。您不能在SQL Server的一个语句中从两个表中删除。我的理解是,这可以在mysql和MS Access中完成。
达伦·格里菲斯

6

试试这个,可能会有所帮助

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

7
它与接受的答案有什么不同:stackoverflow.com/questions/16481379/…
默认语言环境

3
该答案使用显式表命名而不是别名,从而使那些经验不足的人更容易阅读/掌握正在发生的事情。
约书亚伯恩斯

1
@JoshuaBurns:仍然是我的答案的精确重复。
hims056 '19

4

这是我的SQL Server版本

DECLARE @ProfileId table(Id bigint)

DELETE FROM AspNetUsers
OUTPUT deleted.ProfileId INTO @ProfileId
WHERE Email = @email

DELETE FROM UserProfiles    
WHERE Id = (Select Id FROM @ProfileId)

4

您没有为Company和指定表格Date,则可能要修复它。

标准SQL使用MERGE

MERGE WorkRecord2 T
   USING Employee S
      ON T.EmployeeRun = S.EmployeeNo
         AND Company = '1'
         AND Date = '2013-05-06'
WHEN MATCHED THEN DELETE;

@Devart的答案虽然不是完整的,但也是标准SQL,应该看起来像这样:

DELETE 
  FROM WorkRecord2
  WHERE EXISTS ( SELECT *
                   FROM Employee S
                  WHERE S.EmployeeNo = WorkRecord2.EmployeeRun
                        AND Company = '1'
                        AND Date = '2013-05-06' );

上面要注意的重要一点是,显然删除是针对单个表的,如第二个示例中所要求的那样,它需要标量子查询。

对我来说,各种专有语法答案更难阅读和理解。我猜想,@ frans eilering的回答中最好地描述了这种心态,即编写代码的人不一定关心要阅读和维护代码的人。


4

这是我目前用于删除甚至更新的内容:

DELETE           w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.