使用其他字段中具有匹配值的其他记录字段更新记录的字段

时间:2019-12-13 03:57:11

标签: sql

假设我有一个包含以下字段的表格:

  • 开放日期
  • 帐户编号
  • Account_Type
  • 货币
  • 关闭日期
  • Client_Type

除了client_type字段外,所有这些字段的值都不会为空。 client_type字段将为空,但大部分行都不为空。

我正在寻找一种方法来更新每一行的client_type(如果为空),而使用另一行的client_type不为null的另一行,其值与open_date,account_type,currency和close_date匹配。

我尝试合并2个子查询(一个搜索为null,另一个搜索不为null),然后更新表client_type,其中需要匹配2个子查询的open_date,account_type,currency和close_date。该声明花费了超过20分钟的时间才能运行,我必须取消该声明,但我仍然怀疑它是否正确。

是否有一种有效的方法来做到这一点?

2 个答案:

答案 0 :(得分:0)

这样的事情呢?您只能在Client_Type IS NOT NULL处加入表。然后,在Client_Type IS NULL时,使用自联接中的Client_Type

SELECT t1.Open_date,
       t1.Account_No,
       t1.Account_Type,
       t1.Currency,
       t1.Close_Date,
       NVL(t1.Client_Type, t2.Client_Type)

  FROM t1
       LEFT JOIN t1 t2
       ON t1.Open_date = t2.Open_date
          AND t1.Account_No = t2.Account_No
          AND t1.Account_Type = t2.Account_Type
          AND t1.Currency = t2.Currency
          AND t1.Close_Date = t2.Close_Date
          AND Client_Type IS NOT NULL;

答案 1 :(得分:0)

请尝试以下操作:

IF (OBJECT_ID('tempdb..#myTable1') IS NOT NULL)
BEGIN
   DROP TABLE #myTable1
END;

CREATE TABLE #myTable1 (Open_date    datetime,Account_No   int,Account_Type varchar(100),Currency     varchar(100),Close_Date   datetime,Client_Type  varchar(100))

Insert INTO #myTable1(Open_date, Account_No, Account_type, Currency, close_date, client_type)
values
  ('2019-12-12', 1, 'AcctType 1', 'C1', '2019-12-12', 'ct1')
, ('2019-12-13', 2, 'AcctType 2', 'C2', '2019-12-13', 'ct2')
, ('2019-12-14', 3, 'AcctType 3', 'C3', '2019-12-14', 'ct3')
, ('2019-12-12', 4, 'AcctType 1', 'C1', '2019-12-12', null)

--select * from #myTable1

update t2
   set t2.client_type = t1.client_type
--select *
   from #myTable1 t1
   left join #myTable1 t2 
       on t1.Open_date = t2.Open_date 
           and t1.Account_Type = t2.Account_Type 
           and t1.Currency = t2.Currency 
           and t1.Close_Date = t2.Close_Date 

   where 
      t2.Client_Type is null 
      and 
      t1.Client_Type is not null
 select * from #myTable1