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 如果值不在表A中,则选择原始值_Sql_Sql Server_Tsql_Case When - Fatal编程技术网

Sql 如果值不在表A中,则选择原始值

Sql 如果值不在表A中,则选择原始值,sql,sql-server,tsql,case-when,Sql,Sql Server,Tsql,Case When,让我补充更详细的内容,并重新表述我的问题,因为我在下班时匆忙写下了这个问题: 首先是表格: 表A与表B的关系为1:1 表A与表XYZ(我们要更新的表)有1:M关系 我有一个名为sp_parent的存储过程,它调用另一个名为sp_update_child的存储过程(此函数的主要功能是更新表) 在我的sp_update_child中,我有一个如下的变量集: SET @trustee_variable_id = SELECT TOP 1 ID_A

让我补充更详细的内容,并重新表述我的问题,因为我在下班时匆忙写下了这个问题:

首先是表格:

表A与表B的关系为1:1

表A与表XYZ(我们要更新的表)有1:M关系

我有一个名为sp_parent的存储过程,它调用另一个名为sp_update_child的存储过程(此函数的主要功能是更新表)

在我的sp_update_child中,我有一个如下的变量集:

SET @trustee_variable_id = SELECT TOP 1 ID_A
                           FROM TABLE A
                           WHERE clause1 AND clause2 AND etc
它返回一个ID,比如3000

然后转到update语句:

UPDATE TABLE_XYZ
SET TABLE_XYZ.trustee_id = (@trustee_variable_id = TABLE_XYZ.trustee_id`
但是,它无法更新,因为从表A检索到的ID 3000不在表B中,并且更新该特定列的唯一方法是如果ID 3000在表B中

如果从表a检索到的ID不在表B中,如何添加一个检查,然后使用已在“受信者ID”列中的原始ID更新表XYZ.trustee\u ID

下面是我的脚本-不确定我的方向是否正确:

UPDATE TABLE_XYZ 
SET @trustee_variable_id = CASE 
    WHEN @trustee_variable_id NOT IN (SELECT ID_A FROM TABLE_B)
        THEN (SELECT trustee_id FROM TABLE_XYZ WHERE clause1 = clause2)

有人能指出正确的方向吗?

如果我理解你的逻辑,那么。。。。 表a和表b包含两个ID(可能还有其他字段)。你想找的那个,你想用的那个。在您的示例中,id_a和id_b是您希望查找的id,我创建了一个名为return_id的列,该列保存了您要放入正在更新的表中的值

我假设表a可能如下所示:
id\u a,return\u id
1,10
2,20
4,40

表b可能是这样的:
id\u b,返回\u id
1100个
2200
3300
4400

下面是sql:

declare @trustee_variable_id int = 3
select case 
    when 
        not exists  (select return_id from table_a where id_a=@trustee_variable_id ) then
        (select return_id from table_b where id_b=@trustee_variable_id)
    else
        (select return_id from table_a where id_a=@trustee_variable_id)
    end
由于表_a中不存在3,它希望表_b返回300的值

如果使用
declare@trustee\u variable\u id int=2运行它,它将返回20,因为表a中存在2

上面的示例SQL是select语句,请将其转换为更新:

update [SomeTable] set [SomeColumn] = case 
    when 
        not exists  (select return_id from table_a where id_a=@trustee_variable_id ) then
        (select return_id from table_b where id_b=@trustee_variable_id)
    else
        (select return_id from table_a where id_a=@trustee_variable_id)
    end

不要忘记update语句末尾的WHERE子句,否则将更改所有行;)除非这是你的意图。

让我给你一个select语句

select isnull(tableB.col, tableA,col) 
  from tableA 
  left join TableB 
    on tableB.col = tableA.col  

我肯定被你的更新声明弄糊涂了,但我想你可能是这个意思

update table_xyz
set trustee_id = @trustee_variable_id 
where exists (
  select * from table_b where id_b = @trustee_variable_id
)

这对我来说毫无意义。为什么在不更新表时使用update语句?通常使用select语句来设置变量。@Azndevill92嗯,这有很多问题。首先,我要说,SQL update语句更新表中的一列。那么,您想更新列还是设置变量的值?变量以“@”开头,列名不以“@”开头。另外,首先发布表XYZ、A和B的模式以及一些示例数据可能会有所帮助。但希望这个新问题能消除任何困惑。如果这个问题还有任何疑问,请告诉我。您将遇到性能问题,建议不要对每条记录进行查找,您可以使用“从构造更新”是的,其他方法的负载会更轻,但更难阅读(人工),我想OP还没有准备好用于深层sql。;)我的简化查询满足他/她的所有要求(如果不在任何一个表中,则包括null)。从问题的措辞来看,这似乎是一个一次性的更新表格的解决方案,因此不太可能出现长期性能问题。