Як видалити за допомогою INNER JOIN із SQL Server?


1283

Я хочу видалити , використовуючи INNER JOINв SQL Server 2008 .

Але я отримую цю помилку:

Повідомлення 156, рівень 15, стан 1, рядок 15
Неправильний синтаксис біля ключового слова "ІННЕР".

Мій код:

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

2
Приклад C в документації показує, як користуватися DELETEприєднанням
Pondlife

1
Приклад C також використовує курсор і купу сторонніх речей
reggaeguitar

Видалити з table1 з table1 t1 внутрішнє з'єднання table2 t2 на t1.id = t2.id; докладно youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Відповіді:


2241

Вам потрібно вказати таблицю, яку ви видаляєте, ось версія з псевдонімом:

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

9
@bluefeet Ви могли б надати правильний синтаксис для SQL Server для видалення з обох таблиць?
oabarca

44
@ user2070775 У SQL Server для видалення з 2 таблиць потрібно використовувати 2 окремі оператори.
Тарін

8
@ user2070775 в SQL Server ви можете використовувати транзакції та псевдо-таблиці, як показано в stackoverflow.com/questions/783726/…
Матьє Родік

1
@MathieuRodic дякую за обмін. У моєму налаштуванні, якщо я видаляю з 2-х таблиць окремо, я вже не знаю, які рядки видалити з 2-ї таблиці, тому це допоможе :)
Верена Хауншмід,

2
@ShahryarSaljoughi - псевдонім таблиці WorkRecord2.
Taryn

151

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

Отже, ваш остаточний запит має бути таким:

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

3
Цей працює на SQL Server, якщо ви лише маєте намір видалити з першої таблиці.
TroySteven

1
@matwonk: Ви можете видалити з другої таблиці, якщо ви використовуєте ім'я другої таблиці. Наприклад, використання DELETE Employeeбуде видалено з таблиці працівника замість WorkRecord2таблиці.
hims056


30

Можливо, це буде корисно для вас -

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

1
Це єдина відповідь, яка працює на Sql Server. Просто побудувати свій запит як виберіть Код з ... приєднатися ... приєднатися і т.д. , то загорніть його в якості підзапиту і зробити з видалення (таблиця) , де Id в (підзапит)
Кріс Moschini



11

Ця версія повинна працювати

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

11

У студії управління SQL Server я легко можу створити 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


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

8
Я впевнений, що DELETE може вказати лише одну таблицю. Це не працює для мене.
Стелс-рабин

3
Я вважаю, ви можете вказати кілька таблиць для видалення в mySQL, але не SQL Server (про що задається питання).
dandev91

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.


6

Це простий запит для видалення записів з двох таблиць за один раз.

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

2
Це питання стосується SQL Server. Ви не можете видалити з двох таблиць з одного оператора в SQL Server. Я розумію, що це можна зробити в mysql та MS Access.
Даррен Гріффіт

6

Спробуйте це, можливо, це допоможе

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

7
Чим вона відрізняється від прийнятої відповіді: stackoverflow.com/questions/16481379/… ?
локальне місце за замовчуванням

3
Ця відповідь використовує чітке назви таблиць, а не псевдонім, роблячи його більш бажаним для тих, хто не має досвіду, щоб прочитати / зрозуміти, що відбувається.
Джошуа Бернс

1
@JoshuaBurns: Ще точний дублікат моєї відповіді .
hims056

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

Ви не визначаєте таблиці для 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, тобто особа, яка пише код, не обов'язково дбає про людину, яка буде читати та підтримувати код.


4

Ось що я зараз використовую для видалення або навіть оновлення:

DELETE           w
FROM             WorkRecord2   w,
                 Employee      e
WHERE            w.EmployeeRun = e.EmployeeNo
             AND w.Company = '1' 
             AND w.Date = '2013-05-06'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.