1

我有两个表 - table1 和 table2。两张表的现状如下:

表格1:

id   type mon   tue   wed   thu   fri   sat   sun  
1    ets  NULL  NULL  NULL  NULL    NULL    NULL    NULL 
1    ets  NULL  NULL  NULL  NULL    NULL    NULL    NULL 
1    eta  NULL  NULL  NULL  NULL    NULL    NULL    NULL 
1    eta  NULL  NULL  NULL  NULL    NULL    NULL    NULL 
1    cl   NULL  NULL  NULL  NULL    NULL    NULL    NULL 
1    cl   NULL  NULL  NULL  NULL    NULL    NULL    NULL 
2    ets  NULL  NULL  NULL  NULL    NULL    NULL    NULL 
2    ets  NULL  NULL  NULL  NULL    NULL    NULL    NULL 
2    eta  NULL  NULL  NULL  NULL    NULL    NULL    NULL 
2    eta  NULL  NULL  NULL  NULL    NULL    NULL    NULL 
2    cl   NULL  NULL  NULL  NULL    NULL    NULL    NULL 
2    cl   NULL  NULL  NULL  NULL    NULL    NULL    NULL 

表2:

id  ets eta cl
1   mon tue wed
1   thu fri sat
1   sun mon tue
2   sat sun mon
2   fri sat sun

请注意,table2 中的列名称是 table1 中的列“类型”。我想以这样一种方式更新 table1,即 mon-sun 列获取 table2 中针对相应“类型”(即 ets、eta 或 cl)的所有值的更新,并且 table1.id 应该与 table2.id 匹配。

对于上述数据,我想要的结果表如下所示:

id   type mon   tue   wed   thu   fri   sat   sun  
1    ets  1     NULL  NULL  1     NULL  NULL    1 
1    ets  1     NULL  NULL  1     NULL  NULL    1
1    eta  1     1     NULL  NULL  1     NULL    NULL 
1    eta  1     1     NULL  NULL  1     NULL    NULL
1    cl   NULL  1     1     NULL  NULL  1       NULL 
1    cl   NULL  1     1     NULL  NULL  1       NULL
2    ets  NULL  NULL  NULL  NULL  1     1       NULL 
2    ets  NULL  NULL  NULL  NULL  1     1       NULL 
2    eta  NULL  NULL  NULL  NULL  NULL  1       1 
2    eta  NULL  NULL  NULL  NULL  NULL  1       1 
2    cl   1     NULL  NULL  NULL  NULL  NULL    1 
2    cl   1     NULL  NULL  NULL  NULL  NULL    1  

我正在应用的 UPDATE 查询如下:

update a
set a.mon = case b.ets when 'mon' then '1' else '0' end,
a.tue = case b.ets when 'tue' then '1' else '0' end,
a.wed = case b.ets when 'wed' then '1' else '0' end,
a.thu = case b.ets when 'thu' then '1' else '0' end,
a.fri = case b.ets when 'fri' then '1' else '0' end,
a.sat = case b.ets when 'sat' then '1' else '0' end,
a.sun = case b.ets when 'sun' then '1' else '0' end
from table1 a, table2 b
where a.id = b.id and a.type = 'ets'

考虑首先更新 tabletable1.type = 'ets'和 table2 中与 id 匹配的 ets 的相应值。

上面的查询只从 table2 中获取第一个匹配值,并在 table1 中更新,而不是其余的。

任何帮助将不胜感激。

4

1 回答 1

2

您必须在更新之前“旋转”您的表格:

with cte as (
    select
        t.id, c.type,
        max(case when c.value = 'mon' then 1 end) as mon,
        max(case when c.value = 'tue' then 1 end) as tue,
        max(case when c.value = 'wed' then 1 end) as wed,
        max(case when c.value = 'thu' then 1 end) as thu,
        max(case when c.value = 'fri' then 1 end) as fri,
        max(case when c.value = 'sat' then 1 end) as sat,
        max(case when c.value = 'sun' then 1 end) as sun
    from Table2 as t
        outer apply (values
            ('ets', t.[ets]),
            ('eta', t.[eta]),
            ('cl', t.[cl])
        ) as c(type, value)
    group by t.id, c.type
)
update Table1 set
    mon = c.mon,
    tue = c.tue,
    wed = c.wed,
    thu = c.thu,
    fri = c.fri,
    sat = c.sat,
    sun = c.sun
from Table1 as t
    inner join cte as c on c.id = t.id and c.type = t.type

sql fiddle demo

另一种方法是pivot/unpivot:

with cte_up as (
    select id, 1 as value, type, name
    from Table2
    unpivot (name for type in ([ets],[eta],[cl])) as up
), cte_p as (
    select *
    from cte_up
    pivot (max(value) for name in ([mon], [tue], [wed], [thu], [fri], [sat], [sun])) as p
)
update Table1 set
    mon = c.mon,
    tue = c.tue,
    wed = c.wed,
    thu = c.thu,
    fri = c.fri,
    sat = c.sat,
    sun = c.sun
from Table1 as t
    inner join cte_p as c on c.id = t.id and c.type = t.type

sql fiddle demo

于 2013-10-02T17:24:46.370 回答