Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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
使用select和sub select与联接进行sql更新_Sql_Sql Server - Fatal编程技术网

使用select和sub select与联接进行sql更新

使用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语句,如果满足某些条件,我将使用该语句更改建筑字段的值

在这里,我告诉它将我的构建值设置为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.BUILDINGo.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])