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添加了尝试。