问题描述
当前,我的桌子是这样的
id | valName | valCount | type
123 | abb | 3 | 2
123 | abc | 2 | 2
123 | b | 5 | 2
251 | aaa | 2 | 1
251 | ab | 2 | 1
251 | abb | 2 | 1
251 | ac | 2 | 1
,依此类推。 我想为每个id填写缺少的valName并将valCount设置为0。如果我的一组不同的valName是(aaa,aab,ab,abb,abc,ac,b),它将看起来像这样。
id | valName | valCount | type
123 | aaa | 0 | 2
123 | aab | 0 | 2
123 | ab | 0 | 2
123 | abb | 3 | 2
123 | abc | 2 | 2
123 | ac | 0 | 2
123 | b | 5 | 2
251 | aaa | 2 | 1
251 | aab | 0 | 1
251 | ab | 2 | 1
251 | abb | 2 | 1
251 | abc | 0 | 1
251 | ac | 2 | 1
251 | b | 0 | 1
此外,数据集非常大。这样高效的查询会更好。
正如戴尔建议的那样,这是我的尝试。代码中的 TABLE 是我正在使用的表。
select C.id,C.valName,C.type,COALESCE(D.valCount,0 ) as count
from (
select *
from (select id,min(type) as type
From TABLE
Group by id
) B
cross join
(select distinct valName FROM TABLE) A
) C
left join TABLE D
on C.id = D.id
and C.valName = D.valName
order by C.id
此查询的想法是使用交叉连接创建id / valname表,然后使用左连接获取valCount。 该查询有效,但速度太慢。
解决方法
类似这样的东西
with unq_id_type_cte(id,[type]) as (
select distinct id,[type] from mytable)
insert mytable(id,valName,valCount,[type])
select uitc.id,t.v,uitc.[type]
from
(values ('aaa'),('aab'),('ab'),('abb'),('abc'),('ac'),('b')) t(v)
cross join
unq_id_type_cte uitc
where not exists
(select 1 from mytable t_in where uitc.id=t_in.id
and t.v=t_in.valName);
如果存在性能问题或担忧,那么尝试imo的第一件事就是将cte插入索引的临时表中。