Удаление строк несколькими объединениями - PullRequest
3 голосов
/ 28 декабря 2011

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

DELETE FROM Reg INNER JOIN
            RegDoc ON Reg.RegId = RegDoc.RegId INNER JOIN
            Doc ON RegDoc.DocId = Doc.DocId
WHERE Doc.Name LIKE N'%Title%'

получаю ошибку:

Сообщение 156,Уровень 15, состояние 1, строка 1 Неверный синтаксис рядом с ключевым словом «INNER».

Ответы [ 5 ]

4 голосов
/ 28 декабря 2011

Правильный синтаксис:

DELETE [ FROM ] { <object> } 
[ FROM <table_source>]
[ WHERE { <search_condition> } ]

Применительно к вашему примеру это будет

DELETE FROM Reg 
FROM  Reg
      INNER JOIN RegDoc ON Reg.RegId = RegDoc.RegId 
      INNER JOIN Doc ON RegDoc.DocId = Doc.DocId
WHERE Doc.Name LIKE N'%Title%'

Обратите внимание на две ссылки на таблицу Reg

Это можно еще сократить, добавив псевдоним (хотя в этом случае нет особой необходимости)

DELETE FROM r
FROM  Reg r
      INNER JOIN RegDoc ON r.RegId = RegDoc.RegId 
      INNER JOIN Doc ON RegDoc.DocId = Doc.DocId
WHERE Doc.Name LIKE N'%Title%'

MSDN Пример

DELETE FROM Sales.SalesPersonQuotaHistory 
FROM Sales.SalesPersonQuotaHistory AS spqh
INNER JOIN Sales.SalesPerson AS sp
ON spqh.BusinessEntityID = sp.BusinessEntityID
WHERE sp.SalesYTD > 2500000.00;
1 голос
/ 28 декабря 2011

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

DELETE  r 
FROM    Reg as r
INNER JOIN RegDoc rd ON r.RegId = rd.RegId 
INNER JOIN Doc d ON rd.DocId = d.DocId

На самом деле вы можете delete rd и delete d тоже.

1 голос
/ 28 декабря 2011

Вы можете сделать это так:

DELETE Reg
FROM Reg 
INNER JOIN RegDoc ON Reg.RegId = RegDoc.RegId 
INNER JOIN Doc ON RegDoc.DocId = Doc.DocId
WHERE Doc.Name LIKE N'%Title%'
1 голос
/ 28 декабря 2011

Используйте это

DELETE 
FROM Reg 
FROM Reg 
INNER JOIN
            RegDoc ON Reg.RegId = RegDoc.RegId INNER JOIN
            Doc ON RegDoc.DocId = Doc.DocId
WHERE Doc.Name LIKE N'%Title%'

или более ясно, ИМХО:

DELETE Reg 
FROM Reg 
INNER JOIN RegDoc 
  ON Reg.RegId = RegDoc.RegId 
INNER JOIN Doc 
  ON RegDoc.DocId = Doc.DocId
WHERE Doc.Name LIKE N'%Title%'
0 голосов
/ 28 декабря 2011

Немного другой подход, чем другие ответы (которые все хороши)

DELETE FROM Reg
WHERE Reg.RegID IN (SELECT RegDoc.RegId
                    FROM RegDoc
                      INNER JOIN Doc 
                        ON RegDoc.DocId = Doc.DocId
                    WHERE Doc.Name LIKE N'%Title%')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...