Sql 将Update语句转换为带别名的Delete语句
我正在尝试将sql server update语句转换为delete语句,但在创建delete语句时,出现了一个有关别名的错误。我的原始更新连接两个查询,比较两列的值,并更新为true。我的delete与此类似,但将删除上述任一列比较为false的任何行。以下是我的更新声明: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
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。它仍然不喜欢别名。