Ответ 1
Вам нужно указать, какую таблицу вы удаляете, вот версия с псевдонимом:
DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
Я хочу удалить с помощью INNER JOIN
в SQL Server 2008.
Но я получаю эту ошибку:
Msg 156, уровень 15, состояние 1, строка 15
Неправильный синтаксис рядом с ключевым словом "INNER".
Мой код:
DELETE FROM WorkRecord2
INNER JOIN Employee ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND Date = '2013-05-06'
Вам нужно указать, какую таблицу вы удаляете, вот версия с псевдонимом:
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 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 FROM WorkRecord2
FROM Employee
Where EmployeeRun=EmployeeNo
And Company = '1'
AND Date = '2013-05-06'
Это должно быть:
DELETE zpost
FROM zpost
INNER JOIN zcomment ON (zpost.zpostid = zcomment.zpostid)
WHERE zcomment.icomment = "first"
В 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
, будут удалены.
Вы можете даже создать более сложное inner join с помощью той же процедуры, например:
DELETE FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
INNER JOIN LoginBedrijf ON Bedrijf.IDLoginBedrijf = LoginBedrijf.IDLoginBedrijf
Эта версия должна работать
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';
DELETE a FROM WorkRecord2 a
INNER JOIN Employee b
ON a.EmployeeRun = b.EmployeeNo
Where a.Company = '1'
AND a.Date = '2013-05-06'
Другой способ: 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 WorkRecord2
FROM WorkRecord2
INNER JOIN Employee
ON EmployeeRun=EmployeeNo
WHERE Company = '1'
AND Date = '2013-05-06';
Это простой запрос для удаления записей из двух таблиц за раз.
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)
Вы не указываете таблицы для 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 также Standard 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, то есть человек, который пишет код, не обязательно заботится о человеке, который будет читать и поддерживать код.
Вот что я сейчас использую для удаления или даже обновления:
DELETE w
FROM WorkRecord2 w,
Employee e
WHERE w.EmployeeRun = e.EmployeeNo
AND w.Company = '1'
AND w.Date = '2013-05-06'
Если вы хотите удалить связанные данные из более чем одной таблицы в одну, вы можете использовать структуру запроса, как показано ниже:
delete d.*,r.*,a.* from notifications_data d inner join notification_recipient_details r on d.notifications_data_id=r.notifications_data_id inner join notifications_audit a on d.notifications_data_id = a.notifications_data_id
Вышеприведенный запрос отлично работает и удаляет данные из трех таблиц