Как удалить с помощью внутреннего соединения с 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 ответов:
вам нужно указать, из какой таблицы вы удаляете, вот версия с псевдонимом:
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)