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

1491

Я хочу удалить использование INNER JOINв SQL Server 2008 .

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

Msg 156, Level 15, State 1, Line 15
Incorrect syntax near the keyword 'INNER'.

Мой код:

DELETE FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
2
  • 3
    Пример C в документации показывает, как использовать DELETEс соединениемPondlife 10 мая '13 в 14:22
  • 1
    В примере C также используется курсор и куча посторонних вещейreggaeguitar 27 янв.
2605

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

DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
  ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
11
  • 9
    @bluefeet, не могли бы вы предоставить правильный синтаксис SQL Server для удаления из обеих таблиц? oabarca 21 мая '14 в 14:43
  • 54
    @ user2070775 В SQL Server для удаления из 2 таблиц необходимо использовать 2 отдельных оператора. Taryn 27 мая '14 в 14:12
  • 9
    @ user2070775 в SQL Server вы можете использовать транзакции и псевдотаблицы, как показано в stackoverflow.com/questions/783726/…Mathieu Rodic 01 июн.
  • 3
    @MathieuRodic, спасибо, что поделились. В моей настройке, если я удалю из двух таблиц отдельно, я действительно больше не знаю, какие строки удалить из второй таблицы, так что это поможет :)Verena Haunschmid 24 авг.
  • 2
    @ShahryarSaljoughi, это псевдоним для таблицы WorkRecord2. Taryn 29 апр '18 в 18: 572018-04-29 15:57
179

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

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

    DELETE WorkRecord2 
      FROM WorkRecord2 
INNER JOIN Employee 
        ON EmployeeRun=EmployeeNo
     WHERE Company = '1' 
       AND Date = '2013-05-06';
4
  • 3
    Этот работает на SQL Server, если вы собираетесь удалить только из первой таблицы. TroySteven 21 дек '18 в 18:55
  • 2
    @matwonk: Вы можете удалить из второй таблицы, если используете имя второй таблицы. Например, использование DELETE Employeeудалит из таблицы сотрудников вместо WorkRecord2таблицы. Himanshu Jansari 22 дек.
  • 1
  • Порядок удаления может иметь значение, если вы удаляете из таблицы, которая сама является внешним ключом (и не используете каскадное удаление). Но я согласен, в целом, это не имеет значения ...Daniel 8 апр в 20:57
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 ....
)
2
  • 2
    Это единственный ответ, который работает на Sql Server. Просто создайте свой запрос, например, выберите идентификатор из ... присоединиться ... присоединиться и т.д., затем оберните его как подзапрос и выполните удаление из (таблица), где идентификатор в (подзапрос)Chris Moschini 29 сен.
  • 1
    Это один из многих ответов, которые работают на SQL Server. Я предлагаю принятый ответ как лучший способ сделать это. Geoff Griswald 5 окт.
31

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

DELETE FROM WorkRecord2 
       FROM Employee 
Where EmployeeRun=EmployeeNo
      And Company = '1' 
      AND Date = '2013-05-06'
0
18

Должен быть:

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

В 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
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'
0
11

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

DELETE WorkRecord2
FROM WorkRecord2 
INNER JOIN Employee ON EmployeeRun=EmployeeNo
Where Company = '1' AND Date = '2013-05-06'
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';
2
  • 8
    Я почти уверен, что DELETE может указывать только одну таблицу. У меня это не работает. Stealth Rabbi 17 марта '15 в 14:35
  • 4
    Я считаю, что вы можете указать несколько таблиц для удаления в mySQL, но не в SQL Server (что задается вопросом). dandev91 20 дек.
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.

5

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

DELETE           w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
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' );

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

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

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

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

DELETE table1.* ,
       table2.* 
FROM table1 
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'
1
  • 8
    Это вопрос к SQL Server. Вы не можете удалить из двух таблиц в одном операторе SQL Server. Насколько я понимаю, это можно сделать в MySQL и MS Access. Darren Griffith 10 июл.
2

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

DELETE FROM users WHERE id IN(
    SELECT user_id FROM Employee WHERE Company = '1' AND Date = '2013-05-06'
)