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

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

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

Мой код:

DELETE FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
1542
nettoon493 10 Май 2013 в 15:38

15 ответов

Лучший ответ

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

DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
  ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
2541
Peter Mortensen 16 Янв 2021 в 01:00

Вы даже можете сделать подзапрос. Как этот код ниже:

DELETE FROM users WHERE id IN(
    SELECT user_id FROM Employee WHERE Company = '1' AND Date = '2013-05-06'
)
2
Peter Mortensen 16 Янв 2021 в 01:30

Вот моя версия 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
Developer1010 9 Мар 2016 в 09:28

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

DELETE table1.* ,
       table2.* 
FROM table1 
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'
5
Peter Mortensen 21 Янв 2021 в 06:29

Вы не указываете таблицы для 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' );

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

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

5
Peter Mortensen 16 Янв 2021 в 01:19

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

DELETE           w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
5
PPJN 11 Окт 2019 в 19:41

Другой способ - использовать 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.

7
Peter Mortensen 16 Янв 2021 в 01:24

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

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';
9
Peter Mortensen 16 Янв 2021 в 01:06

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

DELETE WorkRecord2
FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
Where Company = '1' AND Date = '2013-05-06'
11
Peter Mortensen 16 Янв 2021 в 01:06
 DELETE a FROM WorkRecord2 a 
       INNER JOIN Employee b 
       ON a.EmployeeRun = b.EmployeeNo 
       Where a.Company = '1' 
       AND a.Date = '2013-05-06'
11
Khurram Ali 29 Апр 2015 в 17:19

В 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
15
Peter Mortensen 16 Янв 2021 в 01:10

Должен быть:

DELETE zpost 
FROM zpost 
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"       
17
Tony Stark 17 Сен 2014 в 13:12

Попробуй это:

DELETE FROM WorkRecord2 
       FROM Employee 
Where EmployeeRun=EmployeeNo
      And Company = '1' 
      AND Date = '2013-05-06'
30
Behrouz Bakhtiari 10 Май 2013 в 17: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 ....
)
32
Peter Mortensen 16 Янв 2021 в 01:03

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

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

    DELETE WorkRecord2 
      FROM WorkRecord2 
INNER JOIN Employee 
        ON EmployeeRun=EmployeeNo
     WHERE Company = '1' 
       AND Date = '2013-05-06';
176
Peter Mortensen 16 Янв 2021 в 01:03