【问题标题】:If value is not in Table A, then select original value如果值不在表 A 中,则选择原始值
【发布时间】:2015-10-27 21:37:58
【问题描述】:

让我添加更详细的问题并重新表述我的问题,因为我在下班时匆匆写下它:

首先是表格:

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

TABLE A 与 TABLE 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 TABLE_XYZ
SET TABLE_XYZ.trustee_id = (@trustee_variable_id = TABLE_XYZ.trustee_id`

但是,它无法更新,因为从表 A 中检索到的 ID 3000 不在表 B 中,并且更新该特定列的唯一方法是如果 ID 3000 在表 B 中。

如果从 TABLE A 检索到的 ID 不在 TABLE B 中,我如何添加一个检查,然后使用已在 trustee_id 列中的原始 ID 更新 TABLE_XYZ.trustee_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)

谁能指出正确的方向?

【问题讨论】:

  • 这对我来说没有任何意义。为什么在不更新表时使用更新语句?通常你会使用一个 select 语句来设置一个变量。
  • @AznDevil92 嗯,这有很多问题。我将首先说 SQL 更新语句更新表中的列。那么您是要更新列还是设置变量的值?变量以“@”开头,列名不是。此外,首先发布表 XYZ、A 和 B 的模式以及一些示例数据可能会有所帮助。
  • 抱歉给大家带来了困惑,我自己并没有完全理解这个查询,因为是其他 DBA 写的。但希望新问题能消除任何困惑。如果对这个问题还有任何困惑,请告诉我。

标签: sql sql-server tsql case-when


【解决方案1】:

我确实对您的更新声明感到困惑,但我认为您可能是这个意思。

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

【讨论】:

    【解决方案2】:

    如果我理解你的逻辑,那么...... Table_a 和 Table_b 包含两个 id(可能还有其他字段)。您想要寻找的,以及您想要使用的。为了您的示例, id_a 和 id_b 是您要查找的 id,我创建了一个名为 return_id 的列,其中包含您要放入正在更新的表中的值。

    我假设 table_a 可能如下所示:
    id_a, return_id
    1、10
    2、20
    4、40

    table_b 可能如下所示:
    id_b, return_id
    1, 100
    2、200
    3、300
    4、400

    现在是 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
    

    由于table_a中不存在3,所以查找table_b返回300的值。

    如果您使用declare @trustee_variable_id int = 2 运行它,它将返回 20,因为 table_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
    

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

    【讨论】:

    • 你会遇到性能问题,建议不要为每条记录生成查找,你可以使用更新从构造msdn.microsoft.com/en-us/library/ms177523.aspx
    • 是的,其他方法的负载会更轻,但更难阅读(人类),我认为 OP 还没有为深度 sql 做好准备。 ;) 我的简化查询满足他/她声明的所有要求(如果不在任一表中,则包括 null)。从问题的表述方式来看,这似乎是更新表格的一次性解决方案,因此不太可能出现长期性能问题。
    【解决方案3】:

    让我给你选择语句

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多