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

avatar
nettoon493
10 мая 2013 в 11:38
1748100
16
1525

Я хочу удалить с помощью 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'
Источник
Pondlife
10 мая 2013 в 14:22
3

Пример C в документации показывает, как использовать DELETE с соединением

reggaeguitar
27 января 2020 в 22:45
2

Пример C использует курсор и кучу посторонних вещей

Ответы (16)

avatar
Taryn
10 мая 2013 в 11:43
2656

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

DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
  ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
oabarca
21 мая 2014 в 14:43
9

@bluefeet, не могли бы вы предоставить правильный синтаксис SQL Server для удаления из обеих таблиц?

Taryn
27 мая 2014 в 14:12
56

@ user2070775 В SQL Server для удаления из 2 таблиц необходимо использовать 2 отдельных оператора.

Mathieu Rodic
1 июня 2014 в 20:28
9

@ user2070775 в SQL Server можно использовать транзакции и псевдотаблицы, как показано в coderhelper.com/questions/783726/…

Verena Haunschmid
24 августа 2016 в 05:56
3

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

Pradeep Kumar
26 сентября 2016 в 08:06
1

"УДАЛИТЬ ИЗ table1 INNER JOIN table2 ON xyz". Будет ли этот запрос удален только из таблицы 1 или из таблицы 1 и таблицы 2?

stomy
9 апреля 2018 в 16:04
1

Не нужно упоминать целевую таблицу более одного раза. См. docs.microsoft.com, пример 3

Shahryar Saljoughi
29 апреля 2018 в 15:56
1

что такое w перед ключевым словом delete?

Taryn
29 апреля 2018 в 15:57
2

@ShahryarSaljoughi, это псевдоним для таблицы WorkRecord2.

Prajakta Kale
17 января 2020 в 07:35
0

каким должен быть запрос на удаление данных из обеих таблиц одновременно?

Geoff Griswald
5 октября 2020 в 13:18
0

Создайте 2 временные таблицы, содержащие строки, которые вы хотите удалить из каждой таблицы. Запускайте два отдельных оператора удаления для каждой таблицы по одному и каждый раз присоединяйтесь к одной из временных таблиц.

NTDLS
10 августа 2021 в 20:53
0

@ user2070775 вы на 100% правы, но с каскадным удалением внешних ключей тот же эффект может быть достигнут с помощью одного оператора, предоставленного пользователем.

avatar
Rahul Biswas
3 октября 2021 в 14:07
1

Удалить несколько табличных данных с помощью блока транзакции, табличной переменной и JOIN.

BEGIN TRANSACTION;

   declare @deletedIds table ( id int );
   
   DELETE w
   output deleted.EmployeeRun into @deletedIds
   FROM WorkRecord2 w
   INNER JOIN Employee e
           ON e.EmployeeNo = w.EmployeeRun
          AND w.Company = 1
          AND w.date = '2013-05-06';

   DELETE e
   FROM Employee as e
   INNER JOIN @deletedIds as d
           ON d.id = e.EmployeeNo;
COMMIT TRANSACTION;

Проверьте по URL-адресу https://dbfiddle.uk/?rdbms=sqlserver_2014&fiddle=43330dda6f1b71b8ec4172a24d5b6921

Удалить несколько данных таблицы с помощью временной таблицы и JOIN. Удалить временную таблицу после удаления.

BEGIN TRANSACTION;

    -- create temporary table
    create table #deletedRecords (employeeId int);
    
    -- INSERT INTO #deletedRecords
    SELECT e.EmployeeNo
    FROM WorkRecord2 w
    INNER JOIN Employee e
           ON e.EmployeeNo = w.EmployeeRun
          AND w.Company = 1
          AND w.date = '2013-05-06';
          
    -- delete from WorkRecord2
    DELETE w
    FROM WorkRecord2 w
    INNER JOIN #deletedRecords d
           ON w.EmployeeRun = d.employeeId;
           
    -- delete from Employee using exists
    DELETE 
    FROM Employee
    WHERE EXISTS (SELECT 1
                  FROM #deletedRecords d
                  WHERE d.employeeId = EmployeeNo);
                  
    -- drop temporary table
    DROP TABLE #deletedRecords;

COMMIT TRANSACTION;

Проверьте по URL-адресу https://dbfiddle.uk/?rdbms=sqlserver_2014&fiddle=d52c6c1ed91669d68fcc6bc91cb32d78

Альтернативный способ создания временных таблиц с помощью SELECT INTO

BEGIN TRANSACTION;

    SELECT  e.EmployeeNo employeeId 
    INTO #deletedRecords
    FROM WorkRecord2 w
    INNER JOIN Employee e
           ON e.EmployeeNo = w.EmployeeRun
          AND w.Company = 1
          AND w.date = '2013-05-06';
          
    -- delete from WorkRecord2
    DELETE w
    FROM WorkRecord2 w
    INNER JOIN #deletedRecords d
           ON w.EmployeeRun = d.employeeId;
           
    -- delete from Employee using exists
    DELETE 
    FROM Employee
    WHERE EXISTS (SELECT 1
                  FROM #deletedRecords d
                  WHERE d.employeeId = EmployeeNo);
                  
    -- drop temporary table
    DROP TABLE #deletedRecords;

COMMIT TRANSACTION;

Проверьте по URL-адресу https://dbfiddle.uk/?rdbms=sqlserver_2014&fiddle=0f02f05616ce5b4dcc8fc67c6cf1e640

Удалить данные одной таблицы с помощью JOIN

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

Проверьте по URL-адресу https://dbfiddle.uk/?rdbms=sqlserver_2014&fiddle=84a60d1368556a8837281df36579334a

Удалить данные одной таблицы с помощью CTE

WITH cte AS (
     SELECT w.EmployeeRun
     FROM WorkRecord2 w
     WHERE EXISTS (SELECT 1
                   FROM Employee 
                   WHERE EmployeeNo = w.EmployeeRun)
         AND w.Company = 1
         AND w.date = '2013-05-06'
)
DELETE
FROM cte

Пожалуйста, проверьте по URL-адресу ​​https://dbfiddle.uk/?rdbms=sqlserver_2014&fiddle=6590007b3c8c2ffad5563bd86606c5b1

Используйте ON CASCADE DELETE во время создания внешнего ключа в дочерней таблице. При удалении данных родительской таблицы соответствующие данные дочерней таблицы удаляются автоматически.

avatar
Rafael Xavier
1 сентября 2020 в 18:28
4

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

DELETE FROM users WHERE id IN(
    SELECT user_id FROM Employee WHERE Company = '1' AND Date = '2013-05-06'
)
avatar
Ady
10 мая 2017 в 13:08
5

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

DELETE table1.* ,
       table2.* 
FROM table1 
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'
Darren Griffith
10 июля 2018 в 21:43
8

Это вопрос к SQL Server. Вы не можете удалить из двух таблиц в одном операторе SQL Server. Насколько я понимаю, это можно сделать в mysql и MS Access.

avatar
PPJN
22 февраля 2017 в 14:50
5

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

DELETE           w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
avatar
Pரதீப்
10 сентября 2016 в 14:59
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 внутри CTE, когда вы хотите delete.

avatar
onedaywhen
19 мая 2016 в 13:22
5

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

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

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

avatar
Andrew
9 марта 2016 в 09:28
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)
avatar
frans eilering
1 июня 2015 в 21:08
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
avatar
Dhanraj Mittal
28 апреля 2015 в 16:00
11
 DELETE a FROM WorkRecord2 a 
       INNER JOIN Employee b 
       ON a.EmployeeRun = b.EmployeeNo 
       Where a.Company = '1' 
       AND a.Date = '2013-05-06'
avatar
yoginder bagga
17 августа 2014 в 08:15
18

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

DELETE zpost 
FROM zpost 
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"       
avatar
AustinTX
12 августа 2014 в 19:56
13

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

DELETE WorkRecord2
FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
Where Company = '1' AND Date = '2013-05-06'
avatar
Ali
16 июля 2014 в 10:16
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';
Stealth Rabbi
17 марта 2015 в 14:35
8

Я почти уверен, что DELETE может указывать только одну таблицу. У меня это не работает.

dandev91
20 декабря 2016 в 05:45
4

Я считаю, что вы можете указать несколько таблиц для удаления в mySQL, но не в SQL Server (что задается вопросом).

avatar
Behrouz Bakhtiari
10 мая 2013 в 17:37
31

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

DELETE FROM WorkRecord2 
       FROM Employee 
Where EmployeeRun=EmployeeNo
      And Company = '1' 
      AND Date = '2013-05-06'
avatar
Devart
10 мая 2013 в 12:12
33

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

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 ....
)
Chris Moschini
29 сентября 2015 в 14:18
2

Это единственный ответ, который работает на Sql Server. Просто создайте свой запрос, например, выберите идентификатор из ... присоединиться ... присоединиться и т.д., затем оберните его как подзапрос и выполните удаление из (таблица), где идентификатор в (подзапрос)

Geoff Griswald
5 октября 2020 в 13:19
1

Это один из многих ответов, которые работают на SQL Server. Я предлагаю принятый ответ как лучший способ сделать это.

avatar
Himanshu Jansari
10 мая 2013 в 12:07
182

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

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

    DELETE WorkRecord2 
      FROM WorkRecord2 
INNER JOIN Employee 
        ON EmployeeRun=EmployeeNo
     WHERE Company = '1' 
       AND Date = '2013-05-06';
TroySteven
21 декабря 2018 в 18:55
3

Этот работает на SQL Server, если вы собираетесь удалить только из первой таблицы.

Himanshu Jansari
22 декабря 2018 в 04:18
2

@matwonk: Вы можете удалить из второй таблицы, если используете имя второй таблицы. Например. использование DELETE Employee удалит из таблицы сотрудников вместо таблицы WorkRecord2.

Himanshu Jansari
2 мая 2019 в 10:52
1

@matwonk: Вот пример: 1) Удаление из первой таблицы 2) Удаление из второй таблицы.

Daniel
8 апреля 2021 в 20:57
0

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