2017-02-20 1 views
1

Я пытаюсь преобразовать оператор обновления sql-сервера в оператор delete, но при создании инструкции delete я получаю сообщение об ошибке наложения псевдонимов. Мое первоначальное обновление объединяет два запроса, сравнивает значения и значения двух столбцов, где true. Мое удаление будет аналогичным, но вместо этого удалит любые строки, в которых любое из приведенных выше сравнений столбцов будет ложным. Вот мое заявление обновления:Преобразование инструкции обновления в команду «Удалить» с псевдонимом

UPDATE drdTable 
SET DeratingPartNumberID = new.DeratingPartNumberID 
    FROM [ReliabilityData].[dbo].[DeratingRefDes] drdTable, ((SELECT drd.[DeratingPartNumberID], [DeratingPartNumber].[Parameter], [DeratingPartNumber].[Units], drd.[DeratingRefDesID] 
     FROM [ReliabilityData].[dbo].[DeratingRefDes] drd 
      INNER JOIN [ReliabilityData].[dbo].[ReferenceDesignator] 
       ON [ReferenceDesignator].[ReferenceDesignatorID] = drd.[ReferenceDesignatorID] 
      INNER JOIN [ReliabilityData].[dbo].[DeratingPartNumber] 
       ON [DeratingPartNumber].[DeratingPartNumberID] = drd.[DeratingPartNumberID] 
      INNER JOIN [ReliabilityData].[dbo].[PartNumber] 
       ON [PartNumber].[PartNumberID] = [ReferenceDesignator].[PartNumberID] 
      INNER JOIN [ReliabilityData].[dbo].[BoardRevision] 
       ON [BoardRevision].[BoardRevisionID] = [ReferenceDesignator].[BoardRevisionID] 
     WHERE [PartNumber] = '2000465-203' AND [ReferenceDesignator].[BoardRevisionID] = 335 AND [ReferenceDesignator] IN ('C1','C2','C3','C4')) AS old 
    JOIN (SELECT [DeratingPartNumberID], [Parameter], [Units] 
     FROM [ReliabilityData].[dbo].[DeratingPartNumber] 
     WHERE [PartNumberID] = 82) AS new ON old.[Parameter] = new.[Parameter] AND old.[Units] = new.[Units]) 
WHERE drdTable.DeratingRefDesId = old.DeratingRefDesIDenter code here 

А вот что у меня есть для моих ВЕЯТ:

DELETE 
FROM drdTable 
FROM [ReliabilityData].[dbo].[DeratingRefDes] AS drdTable 
WHERE DeratingPartNumberID IN (
     (
     SELECT drd.[DeratingPartNumberID], 
       [DeratingPartNumber].[Parameter], 
       [DeratingPartNumber].[Units], 
       drd.[DeratingRefDesID] 
     FROM [ReliabilityData].[dbo].[DeratingRefDes] drd 
      INNER JOIN [ReliabilityData].[dbo].[ReferenceDesignator] 
       ON [ReferenceDesignator].[ReferenceDesignatorID] = drd.[ReferenceDesignatorID] 
      INNER JOIN [ReliabilityData].[dbo].[DeratingPartNumber] 
       ON [DeratingPartNumber].[DeratingPartNumberID] = drd.[DeratingPartNumberID] 
      INNER JOIN [ReliabilityData].[dbo].[PartNumber] 
       ON [PartNumber].[PartNumberID] = [ReferenceDesignator].[PartNumberID] 
      INNER JOIN [ReliabilityData].[dbo].[BoardRevision] 
       ON [BoardRevision].[BoardRevisionID] = [ReferenceDesignator].[BoardRevisionID] 
     WHERE [PartNumber] = '2000465-203' 
      AND [ReferenceDesignator].[BoardRevisionID] = 335 
      AND [ReferenceDesignator] IN ('C1','C2','C3','C4') 
     ) AS old 
     JOIN (
      SELECT [DeratingPartNumberID], 
        [Parameter], 
        [Units] 
      FROM [ReliabilityData].[dbo].[DeratingPartNumber] 
      WHERE [PartNumberID] = 82 
      ) AS new 
     ON old.[Parameter] <> new.[Parameter] 
      or old.[Units] <> new.[Units] 
     ) 
WHERE drdTable.DeratingRefDesId = old.DeratingRefDesID 

Я получаю сообщение об ошибке, жалуясь о ступенчатости я использую в моих отборных заявлениях.

Msg 156, Level 15, State 1, Line 13 
Incorrect syntax near the keyword 'AS'. 
Msg 156, Level 15, State 1, Line 16 
Incorrect syntax near the keyword 'AS'. 

Обратите внимание, что сглаживание он имеет в виду это сглаживание из выбранных запросов (т.е. «старая» и «новая» ссылка. Любые предложения о том, как я могу переписать мой запрос?

+0

Возможный дубликат [Как удалить с помощью INNER JOIN с SQL Server?] (http://stackoverflow.com/questions/16481379/how-to-delete-using-inner-join-with-sql-server) – Ralph

+0

Я только что отредактировал OP и сделал некоторые отступы для 'DELETE'query. Таким образом, должно быть легко увидеть проблемы со вторым «FROM» и вторым «WHERE». Просто удалите первый 'FROM' (как предлагается ниже) и замените последний' WHERE' на 'AND'. Тогда это должно сработать. BTW: правильное форматирование всегда является отличным способом в SQL для выявления возможных препятствий/ошибок. – Ralph

+0

Эта запись не описывает, как псевдоним запроса select в инструкции delete. –

ответ

2

У вас есть дополнительный from.

При удалении из совмещенной таблицы, синтаксис delete alias from tbl as alias ...

не используйте старый стиль соединяет. Bad habits to kick : using old-style JOINs

Насколько я могу сказать, что это уборщик версия запросов:

для update:

use ReliabilityData; 
go 

/* update old with new Id where new Parameter and Units are the same */ 

update drd 
set DeratingPartNumberID = dpn_new.DeratingPartNumberID 
from dbo.DeratingRefDes as drd 
    inner join dbo.DeratingPartNumber as dpn_old /* old */ 
    on dpn_old.DeratingPartNumberID = drd.DeratingPartNumberID 
    inner join dbo.ReferenceDesignator as rd 
    on rd.ReferenceDesignatorID = drd.ReferenceDesignatorID 
    inner join dbo.PartNumber as pn 
    on pn.PartNumberID = rd.PartNumberID 
    -- BoardRevision is not referenced in the where clause, so not needed */ 
    /* inner join dbo.BoardRevision as br 
    on br.BoardRevisionID = rd.BoardRevisionID */ 
    /* new */ 
    inner join dbo.DeratingPartNumber as dpn_new 
    on dpn_old.Parameter = dpn_new.Parameter 
    and dpn_old.Units  = dpn_new.Units 
where pn.PartNumber = '2000465-203' 
    and rd.BoardRevisionID = 335 
    and rd.ReferenceDesignator in ('C1', 'C2', 'C3', 'C4') 
    and dpn_new.PartNumberID = 82 

и для delete:

use ReliabilityData; 
go 

/* delete old where new Parameter and Units are different */ 

delete drd 
from dbo.DeratingRefDes as drd 
    inner join dbo.DeratingPartNumber as dpn_old /* old */ 
    on dpn_old.DeratingPartNumberID = drd.DeratingPartNumberID 
    inner join dbo.ReferenceDesignator as rd 
    on rd.ReferenceDesignatorID = drd.ReferenceDesignatorID 
    inner join dbo.PartNumber as pn 
    on pn.PartNumberID = rd.PartNumberID 
    -- BoardRevision is not referenced in the where clause, so not needed */ 
    /* inner join dbo.BoardRevision as br 
    on br.BoardRevisionID = rd.BoardRevisionID */ 
    /* new */ 
    inner join dbo.DeratingPartNumber as dpn_new 
    on dpn_old.Parameter != dpn_new.Parameter 
    and dpn_old.Units  != dpn_new.Units 
where pn.PartNumber = '2000465-203' 
    and rd.BoardRevisionID = 335 
    and rd.ReferenceDesignator in ('C1', 'C2', 'C3', 'C4') 
    and dpn_new.PartNumberID = 82 
+0

Я получаю те же ошибки. Сглаживание, о котором он жалуется, относится к операторам выбора, где я называю их «старыми» и «новыми». –

+0

@SqlZim. Существует не только один «из» слишком много, но и «где» (в конце) слишком много. – Ralph

+0

@ChrisSearcy Обновлено – SqlZim

Смежные вопросы