假设我有一个包含以下字段的表格:
除了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分钟的时间才能运行,我必须取消该声明,但我仍然怀疑它是否正确。
是否有一种有效的方法来做到这一点?
答案 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