1

ID に基づいて、特定の sheetname 列の最初の行のみにcustomerproject、およびplantの値が含まれる MSSQL 2012 テーブルがあります。

ここで、これら 3 つの列のレコードを、ID が同じで sheetname = "sheet 1" である他のすべての行に "コピー" したいと考えています。

これは、入力テーブルと目的の出力テーブルのフィドルです。

「コピー」とは、実際のテーブルを更新するのではなく、列にそれらのレコードのみを入力するビューを作成することを意味します。

現時点では、どうすればそこにたどり着くことができるのかわからないので、助けていただければ幸いです。ビューで素晴らしいパフォーマンスが得られるとは思えません。手順は、私が推測するより良い仕事をするでしょう。

ありがとうございました。

更新 別のタスクでフィドルを更新しました。レコードがnullの場合、以前のコメント値を使用する必要があるというコメント列を追加しました。

4

3 に答える 3

1

まず、入力テーブルのすべての行に同じ ID を入力しましたが、これはエラーだと思いました。そして、私はあなたの説明を正確に得られなかったことを告白します。あなたは主に悪いデザイン、主キーなし、テーブルを2つの異なるテーブルに簡単に分割できる1つのテーブルのみに苦しんでいると思います。しかし、私の謙虚な解決策があります。それが本当にあなたが望むことをするかどうかはわかりませんが、彼はあなたがそれをするのを助けることができます.

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 の各行に少なくとも 1 つの行があり、on の後の条件で、次の場合にのみ j の行を追加したいとします。 id は同じ AND であり、顧客名がある場合。

于 2013-07-19T09:42:53.140 に答える
0

あなたのデザインには欠陥があります。多数の null 値を調べて、これらの値を正規化します。もう一度簡単に見てみると、Customer、Project、および Plant を他のテーブルに正規化できます。これらを結合すると、出力 2 が得られます。

于 2013-07-19T09:06:03.813 に答える
0

他のすべての列が常に null の場合、このビューを次のように使用してパフォーマンスを向上させることができます。

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 に答える