Sql server 为SQL中缺少的值创建行(决策树的数据准备)
现在,我的桌子看起来像这样Sql server 为SQL中缺少的值创建行(决策树的数据准备),sql-server,sql-insert,decision-tree,Sql Server,Sql Insert,Decision Tree,现在,我的桌子看起来像这样 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 | a
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
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, 0, 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);
等等。
我想为每个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
而且,数据集相当大。因此,高效查询更好
正如戴尔所说,这是我的尝试代码中的表是我正在使用的表
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。
此查询工作正常,但速度太慢。类似这样的查询
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
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, 0, 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插入索引的临时表。一组不同的ValName是一个具有持久值的静态列表(aaa、aab、ab、abb、abc、ac、b)?如果具有持久值的静态列表意味着该列表从不更改,则为。我想为每个id的7个valName中的每一个单独一行。请向我们展示您的尝试-因此这不是代码编写服务。@Dale K添加了尝试。