2017-02-20 41 views
1

我試圖將sql server更新語句轉換爲delete語句,但創建delete語句時出現了有關別名的錯誤。我原來的更新連接兩個查詢,比較兩列的值,並更新哪裏是真的。我的刪除將類似,但將刪除上述列比較中的任一個爲假的任何行。這裏是我的更新語句:將更新語句轉換爲帶有別名的刪除語句

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語句:

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」查詢的縮進。像這樣,應該很容易看到第二個'FROM'和第二個'WHERE'的問題。只要刪除第一個'FROM'(如下所示)並用'AND'替換最後一個'WHERE'。那麼它應該工作。順便說一句:正確的格式化在SQL中總是一個很好的方法來識別可能的障礙/錯誤。 – Ralph

+0

該條目不包括如何在刪除語句中對選擇查詢進行別名。 –

回答

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

我得到相同的錯誤。它抱怨的別名是在select語句中,我把它們稱爲'old'和'new' –

+0

@SqlZim不僅有一個'from'太多,而且還有'where'(最後)太多。 – Ralph

+0

@ChrisSearcy更新 – SqlZim