Как удалить с помощью INNER JOIN с SQL Server?

Я хочу удалить с помощью INNER JOIN в SQL Server 2008.

Но я получаю эту ошибку:

Msg 156, уровень 15, состояние 1, строка 15
Неправильный синтаксис рядом с ключевым словом "INNER".

Мой код:

DELETE FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
954
10 мая '13 в 14:38
источник поделиться
16 ответов

Вам нужно указать, какую таблицу вы удаляете, вот версия с псевдонимом:

DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
  ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
1700
10 мая '13 в 14:43
источник

Просто добавьте имя таблицы между DELETE и FROM, где вы хотите удалить записи, потому что нам нужно указать удаляемую таблицу. Также удалите предложение ORDER BY, потому что при удалении записей ничего не нужно заказывать.

Итак, ваш окончательный запрос должен выглядеть следующим образом:

    DELETE WorkRecord2 
      FROM WorkRecord2 
INNER JOIN Employee 
        ON EmployeeRun=EmployeeNo
     WHERE Company = '1' 
       AND Date = '2013-05-06';
108
10 мая '13 в 15:07
источник

Попробуйте следующее:

DELETE FROM WorkRecord2 
       FROM Employee 
Where EmployeeRun=EmployeeNo
      And Company = '1' 
      AND Date = '2013-05-06'
25
10 мая '13 в 20:37
источник

Возможно, это будет полезно для вас -

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 ....
)
21
10 мая '13 в 15:12
источник

Это должно быть:

DELETE zpost 
FROM zpost 
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"       
11
17 авг. '14 в 11:15
источник

Эта версия должна работать

DELETE WorkRecord2
FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
Where Company = '1' AND Date = '2013-05-06'
8
12 авг. '14 в 22:56
источник

Попробуйте этот запрос:

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
16 июля '14 в 13:16
источник

В 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
6
02 июня '15 в 0:08
источник
 DELETE a FROM WorkRecord2 a 
       INNER JOIN Employee b 
       ON a.EmployeeRun = b.EmployeeNo 
       Where a.Company = '1' 
       AND a.Date = '2013-05-06'
4
28 апр. '15 в 19:00
источник

Другой способ: 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 внутри CTE, если вы хотите delete.

3
10 сент. '16 в 17:59
источник

Попробуйте это, это может помочь

 DELETE WorkRecord2 
          FROM WorkRecord2 
    INNER JOIN Employee 
            ON EmployeeRun=EmployeeNo
         WHERE Company = '1' 
           AND Date = '2013-05-06';
2
10 апр. '18 в 10:26
источник

Это простой запрос для удаления записей из двух таблиц за раз.

DELETE table1.* ,
       table2.* 
FROM table1 
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'
2
10 мая '17 в 16:08
источник

Вы не указываете таблицы для 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 также Standard 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, то есть человек, который пишет код, не обязательно заботится о человеке, который будет читать и поддерживать код.

2
19 мая '16 в 16:22
источник

Вот моя версия 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)
1
09 марта '16 в 12:28
источник

Вот что я сейчас использую для удаления или даже обновления:

DELETE FROM      w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
1
22 февр. '17 в 17:50
источник

Если вы хотите удалить связанные данные из более чем одной таблицы в одну, вы можете использовать структуру запроса, как показано ниже:

delete d.*,r.*,a.* from notifications_data d inner join notification_recipient_details r on d.notifications_data_id=r.notifications_data_id inner join notifications_audit a on d.notifications_data_id = a.notifications_data_id

Вышеприведенный запрос отлично работает и удаляет данные из трех таблиц

0
06 дек. '18 в 9:20
источник

Посмотрите другие вопросы по меткам или Задайте вопрос