Как удалить с помощью внутреннего соединения с SQL Server?


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

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

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

мой код:

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

15 ответов:

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

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

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

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

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

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

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

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

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 ....
)

должно быть:

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

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

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

попробуйте выполнить этот запрос :

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';

В 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
 DELETE a FROM WorkRecord2 a 
       INNER JOIN Employee b 
       ON a.EmployeeRun = b.EmployeeNo 
       Where a.Company = '1' 
       AND a.Date = '2013-05-06'

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

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

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

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

вот моя версия 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)

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

DELETE FROM      w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'

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

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