使用select和sub select与联接进行sql更新
我有一个update语句,如果满足某些条件,我将使用该语句更改建筑字段的值 在这里,我告诉它将我的构建值设置为select语句的结果使用select和sub select与联接进行sql更新,sql,sql-server,Sql,Sql Server,我有一个update语句,如果满足某些条件,我将使用该语句更改建筑字段的值 在这里,我告诉它将我的构建值设置为select语句的结果 update Table set Building = (select case when child.date determined between child.entry date and child.withdrawal date then child.building else child.[offender bldg]end 然后,我的select语句
update Table set Building = (select case when child.date determined between child.entry date and child.withdrawal date
then child.building else child.[offender bldg]end
然后,我的select语句是另一个select语句的产物,在该语句中,我必须定义date3的值,因为它有空值,我需要它强制它为当前日期,以确保捕获所有需要更新的记录
from (select w.BUILDING, [Withdrawal Date] = case when WITHDRAWAL_DATE is null then GETDATE() else w.WITHDRAWAL_DATE end,a.DATE_DETERMINED,w.ENTRY_DATE,a.RESP_BUILDING,o.BUILDING[Offender Bldg]
from dbo._temp_disc_off a inner join dbo.offender o on (a.INCIDENT_ID = o.INCIDENT_ID) inner join dbo.entry w on (o.PERSON_ID = w.STUDENT_ID))child</b>
问题是:
更新表集生成=(子查询)
您试图做的是使用子查询返回的单个值更新单个列Building。但是,子查询返回的值不止一个。所以不是4号楼,而是4号楼、10号楼和19号楼。Sql Server无法将一列设置为多个值,并引发错误
最简单的调试方法是将整个update语句转换为select语句,该语句选择原始值和要更新的值。您可以检查结果select,查看为什么子select中有重复的行,并找出如何返回单个值,或者可能将多行串联或分组在一起以返回单个值。我已经找到了答案,我完全把事情复杂化了,只需运行一条语句,在where子句中包含CASE语句,就可以更新所需的字段。这允许我检查确定的日期是否在这两个日期之间,同时用当前日期替换取款日期的空值。以下是我的声明: 更新dbo.\u temp\u disc\u off\u action设置RESP\u BUILDING=w.BUILDING
从dbo.\u temp\u disc\u off\u动作a
加入dbo.disc\u违法者o开(a.INCIDENT\u ID=o.INCIDENT\u ID)
加入dbo.REG\u条目,w开(o.PERSON\u ID=w.STUDENT\u ID)
如果a.DATE\u在w.ENTRY\u DATE和
之间确定,则当w.retraction\u DATE为空时,则GETDATE()否则w.retraction\u DATEEND
和a.RESP\u BUILDING为空且**o.BUILDING='41' **或a.DATE\u在w.ENTRY\u DATE和案例之间确定,当**w.drawing\u DATE**为空时GETDATE()否则w.drawing\u DATE结束
和a.RESP_大楼o.BUILDING和o.BUILDING='41'
您正在尝试更新哪个表<代码>条目?能否将整个SQL语句作为一个块发布?我已经用完整的块更新了我的问题,我只是试图解释我对每个部分所做的操作。我正在尝试更新临时磁盘关闭操作表
where child.DATE_DETERMINED between child.ENTRY_DATE and child.[Withdrawal Date] and child.RESP_BUILDING is null
or child.DATE_DETERMINED between child.ENTRY_DATE and child.[Withdrawal Date] and child.RESP_BUILDING <> child.[Offender Bldg])</b>
update dbo._temp_disc_off_action
set RESP_BUILDING = (
select case when child.DATE_DETERMINED between child.entry_date and child.[Withdrawal Date]
then child.BUILDING else child.[Offender Bldg] end
from (
select w.BUILDING, [Withdrawal Date] = case when WITHDRAWAL_DATE is null
then GETDATE()
else w.WITHDRAWAL_DATE end,
a.DATE_DETERMINED, w.ENTRY_DATE, a.RESP_BUILDING, o.BUILDING [Offender Bldg]
from dbo._temp_disc_off_action a
inner join dbo.DISC_OFFENDER o
on a.INCIDENT_ID = o.INCIDENT_ID
inner join dbo.REG_ENTRY_WITH w
on o.PERSON_ID = w.STUDENT_ID
where w.BUILDING = 41) child
where child.DATE_DETERMINED between child.ENTRY_DATE and child.[Withdrawal Date]
and child.RESP_BUILDING is null
or child.DATE_DETERMINED between child.ENTRY_DATE and child.[Withdrawal Date]
and child.RESP_BUILDING <> child.[Offender Bldg])