Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将Update语句转换为带别名的Delete语句_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 将Update语句转换为带别名的Delete语句

Sql 将Update语句转换为带别名的Delete语句,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试将sql server update语句转换为delete语句,但在创建delete语句时,出现了一个有关别名的错误。我的原始更新连接两个查询,比较两列的值,并更新为true。我的delete与此类似,但将删除上述任一列比较为false的任何行。以下是我的更新声明: UPDATE drdTable SET DeratingPartNumberID = new.DeratingPartNumberID FROM [ReliabilityData].[dbo].[Derating

我正在尝试将sql server update语句转换为delete语句,但在创建delete语句时,出现了一个有关别名的错误。我的原始更新连接两个查询,比较两列的值,并更新为true。我的delete与此类似,但将删除上述任一列比较为false的任何行。以下是我的更新声明:

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
下面是我的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 
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

请注意,它所指的别名是select查询的别名(即“旧”和“新”引用)。是否有关于如何重写查询的建议?

您有来自的额外

从别名表中删除时,语法为
delete alias from tbl as alias…

不要使用旧式连接

据我所知,这是您查询的更清晰版本:

对于
更新

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
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
对于
删除

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

我也有同样的错误。它抱怨的别名出现在select语句中,我将它们称为“旧”和“新”@SqlZim不仅有一个
from
太多,还有一个
where
(结尾)太多了。@ChrisSearcyUpdated@SqlZim这很近(顺便说一句,更干净了,谢谢!),但现在,在这两个查询中,我得到了不同的错误消息:
Msg 4104,16级,状态1,第8行多部分标识符“rd.PartNumberID”无法绑定。
@ChrisSearcy已修复。在重新排列所有内容时,我成功地获得了一个无序的联接。我刚刚编辑了OP,并对
删除
查询进行了一些缩进。这样,应该很容易看到
中的第二个
中的第二个
的问题。只需删除从
开始的第一个
(建议如下)然后将最后一个
WHERE
替换为
。这样就可以了。顺便说一句:在SQL中,正确的格式总是识别可能的障碍/错误的好方法。该条目不包括如何在delete语句中为select查询别名。@Ralph I从中删除了额外的,并将最后一个WHERE替换为and,但仍然不会删除xecute。它仍然不喜欢别名。