Я хочу удалить с помощью 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'
16 ответов
Вам необходимо указать, из какой таблицы вы удаляете. Вот версия с псевдонимом:
DELETE w
FROM WorkRecord2 w
INNER JOIN Employee e
ON EmployeeRun=EmployeeNo
WHERE Company = '1' AND 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'
Эта версия должна работать:
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';
Другой способ - использовать 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
и FROM
, откуда вы хотите удалить записи, потому что мы должны указать таблицу для удаления. Также удалите предложение ORDER BY
, потому что при удалении записей нечего упорядочивать.
Итак, ваш окончательный запрос должен быть таким:
DELETE WorkRecord2
FROM WorkRecord2
INNER JOIN Employee
ON EmployeeRun=EmployeeNo
WHERE Company = '1'
AND Date = '2013-05-06';
DELETE Employee
удалит из таблицы Сотрудника вместо таблицы WorkRecord2
.
Возможно, это будет вам полезно -
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
, будут удалены.
Вы можете даже создать более сложное внутреннее соединение с помощью той же процедуры, например:
DELETE FROM Contact
INNER JOIN Bedrijf ON Bedrijf.IDBedrijf = Contact.IDbedrijf
INNER JOIN LoginBedrijf ON Bedrijf.IDLoginBedrijf = LoginBedrijf.IDLoginBedrijf
Вы не указываете таблицы для 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' );
Важно отметить вышесказанное: очевидно, что удаление нацелено на одну таблицу, как это предусмотрено во втором примере, требуя скалярного подзапроса.
Мне труднее читать и понимать ответы на различные проприетарные синтаксисы. Думаю, образ мышления лучше всего описать в ответ Франса Эйлеринга, т.е. человек, пишущий код, не обязательно заботится о человеке, который будет читать и поддерживать код.
Вот моя версия 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 table1.* ,
table2.*
FROM table1
INNER JOIN table2 ON table1.id= table2.id where table1.id ='given_id'
Вы даже можете сделать подзапрос. Как этот код ниже:
DELETE FROM users WHERE id IN(
SELECT user_id FROM Employee WHERE Company = '1' AND Date = '2013-05-06'
)
Вот что я сейчас использую для удаления или даже обновления:
DELETE w
FROM WorkRecord2 w,
Employee e
WHERE w.EmployeeRun = e.EmployeeNo
AND w.Company = '1'
AND w.Date = '2013-05-06'
Удалите несколько табличных данных, используя блок транзакции, табличную переменную и 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/4&rdbd24e4d06e4e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6
Удалите несколько данных таблицы с помощью временной таблицы и 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/16fserc78cdl2dl6ddd06d6d6d6d6d06d6d6d6e6d6e6fdddddddddddddddddddddddddddddddddd2
Альтернативный способ создания временных таблиц с помощью 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.uk6fc6e6e0c8cf0cf0c8cf0c6f0cf0cf0c6f0cf0cf0cf0cf0cf0c6f0cf0cf0cf0cf0cf0cf0cf0cf0cf0cf0cf0cf0cf0cf0cfd0cf0,
Удалите данные одной таблицы с помощью 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=14&alserver_ru/?rdbms=sqalserver_ru/?rdbms=14&Alserver_08983
Удалить данные одной таблицы с помощью 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/cfd86606c5d06e6d06e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e6e5
Используйте ON CASCADE DELETE во время создания внешнего ключа в дочерней таблице. При удалении данных родительской таблицы соответствующие данные дочерней таблицы удаляются автоматически.
Похожие вопросы
Связанные вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.
DELETE
с присоединением