1

我有一个 MSSQL 2012 表,其中只有某个 sheetname 列的第一行包含基于 ID的customerprojectfactory的值。

现在我想将这三列的记录“复制”到ID 相同且 sheetname =“sheet 1”的所有其他行。

这是一个输入和所需输出表的小提琴。

对于“复制”,我的意思是我不想更新实际的表,而是想创建一个只会用这些记录填充列的视图。

目前我不知道如何才能到达那里,所以希望你能帮助我。我怀疑我是否能在视野中获得出色的表现。我猜一个程序会做得更好。

谢谢你。

更新 我已经用另一个任务更新了小提琴:我添加了一个评论列,如果记录为空,则应该使用之前的评论值。

4

3 回答 3

1

首先,您确实为输入表中的所有行输入了相同的 id,我认为这是一个错误。然后我承认我没有完全得到你的解释,我认为你主要是因为设计不好,没有主键,只有一个表,而你可以很容易地将你的表分成两个不同的表。但是我有一个不起眼的解决方案,再次不确定它是否真的能做到你想要的,但他可以帮助你做到这一点。

SELECT 
myInputTable.id,
myInputTable.row,
j.customer,j.project,
j.plant,myInputTable.sheetname
FROM myInputTable
LEFT JOIN myInputTable AS j
ON (myInputTable.id=j.id AND j.customer IS NOT NULL)

Join 允许您在具有左连接的表的结果中添加列,对于 myInputTable 的每一行,您将至少有一行,在 on 之后的条件是,您说您只想添加一行 j 仅当id 是相同的,如果有客户名称。

于 2013-07-19T09:42:53.140 回答
0

你的设计有缺陷。查看大量空值并将这些值标准化。再快速浏览一下,客户、项目和工厂可以标准化为其他表 - 将它们连接在一起将为您提供输出 2。

于 2013-07-19T09:06:03.813 回答
0

如果所有其他列始终为空,您可以像这样使用此视图并获得良好的性能:

CREATE VIEW v_yourview as
SELECT id, row, min(customer) over (partition by id) customer,
min(project) over (partition by id) project,
min(plant) over (partition by id) plant,
sheetname
from myInputTable

如果要更新所有行。由于您的数据中没有时间戳或唯一 ID,我通过添加临时 row_number 来伪造它:(我相信您在小提琴中犯了错误,我试图纠正它)

CREATE TABLE  #myInputTable 
    (
     id int, 
     row int, 
     customer varchar(30),
      project varchar(30),
      plant varchar(30),
      sheetname varchar(30),
      comment varchar(30)
    );

INSERT INTO #myInputTable
(id, row, customer,project,plant, sheetname,comment)
VALUES
(1,1, 'Customer Name', 'Project Name', 'Plant Name', 'sheet 1','comment 1')
,
(1,1,NULL ,NULL ,NULL , 'sheet 2',Null)
,(1,1,NULL ,NULL ,NULL , 'sheet 3',Null)
,(1,2,NULL ,NULL ,NULL , 'sheet 2','comment 2')
,(1,2,NULL ,NULL ,NULL , 'sheet 3',Null)
-- I changed value for ID from 1 to 2 in next line
,(2,1, 'Customer Name 2', 'Project Name', 'Plant Name', 'sheet 1', 'new comment')
,
(2,1,NULL ,NULL ,NULL , 'sheet 2',Null)
,(2,1,NULL ,NULL ,NULL , 'sheet 3',Null)
,(2,2,NULL ,NULL ,NULL , 'sheet 2',Null)
,(2,2,NULL ,NULL ,NULL , 'sheet 3',Null)


;with t1 as
(
select *, row_number() over (order by id) rn
from #myInputTable
)
update t1
set 
customer = t2.customer,
project  = t2.project,
plant    = t2.plant,
comment  = t3.comment
from t1
join #myInputTable t2
on t2.customer is not null
and t1.id = t2.id
cross apply(select top 1 comment from t1 t where rn <= t1.rn and comment is not null order by rn desc) t3
where t1.customer is null

select * from #myInputTable
于 2013-07-19T11:16:55.640 回答