0

次のような製品の表があります。

Products (companyID int, product1 int, product2 int ... product8 int)

製品の詳細の表は次のようになります。

ProductDetails (companyID int productID int)

私の ProductDetails テーブルには、companyID ごとに (最大で) 8 行の製品があります。

Products.companyID = ProductDetails.companyID である ProductDetails テーブルの行から、各行 (8 つ) の製品が製品の値を取得する Products テーブルを更新したいと思います。

ループなしでこれを行う方法はありますか (つまり、1 つの更新コマンド)?

編集:

したがって、Products テーブルには会社情報のみが含まれ (製品情報は含まれません)、ProductDetails テーブルには 1 ~ 8 個の製品/会社に関する情報が含まれます。

SO 1 つの更新コマンドで、各行 (product1、product2 ... product8) の Products テーブルを、各会社の ProductDetails テーブルにある製品で更新する必要があります。

4

2 に答える 2

1

データをテーブルにピボットして、8 列を許可します。以下の例では 8 個の製品が表示されます。それ以上の製品がある場合、それらは単純にどこにも挿入されません。

create table company (
    companyid int,
    name varchar(100));
insert company values (1203, 'Apple');
insert company values (7707, 'Microsoft');
create table products (
    companyid int,
    product1 varchar(100),
    product2 varchar(100),
    product3 varchar(100),
    product4 varchar(100),
    product5 varchar(100),
    product6 varchar(100),
    product7 varchar(100),
    product8 varchar(100));
create table productdetails (
    companyid int,
    product varchar(100));
insert into productdetails values (1203, 'iPad');
insert into productdetails values (1203, 'iPhone');
insert into productdetails values (1203, 'iPod');
insert into productdetails values (7707, 'Visual Studio');
insert into productdetails values (7707, 'Office');


insert products
select *
  from (
select companyid, product, rn=row_number() over (partition by companyid order by product)
  from productdetails
) source
pivot (max(product) for rn in ([1],[2],[3],[4],[5],[6],[7],[8])) pv;
于 2013-05-20T03:52:25.790 に答える
0

確かにデザインが悪い。s テーブルProductIDには列が1 つだけある必要があります。Productしかし、この構造を使用している限り、この醜いソリューション (SQL Server 2005 以降) を使用できます。

declare @Products table(companyID int, product1 int, product2 int, product3 int,product4 int,product5 int,product6 int,product7 int, product8 int)
declare @ProductDetails table(companyID int, productID int)

insert into @Products (companyID) values (1)

insert into @ProductDetails (companyID,productID) values (1,17015),(1,278465),(1,3554646)

;with cte as
(
    select companyID, productID, ROW_NUMBER() OVER (PARTITION BY companyID ORDER BY ProductID) nmb
    from @ProductDetails
)
UPDATE p
SET product1= c1.productID,
    product2= c2.productID,
    product3= c3.productID
    ...
FROM @Products p
     left join cte c1 ON c1.companyID=p.companyID AND c1.nmb=1
     left join cte c2 ON c2.companyID=p.companyID AND c2.nmb=2
     left join cte c3 ON c3.companyID=p.companyID AND c3.nmb=3 
     ...

SELECT * FROM @Products
于 2013-05-20T03:46:30.897 に答える