从不同表中的许多行更新x列

时间:2013-05-20 03:12:37

标签: sql sql-server tsql

我有一张产品表,如下所示:

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

和产品详情表如下:

ProductDetails (companyID int productID int)

我的ProductDetails表(每个公司ID)最多有8行产品。

我想更新Products表,其中每行中的产品(其中8个)从ProductDetails表行获取产品的值,其中Products.companyID = ProductDetails.companyID

有没有办法在没有循环的情况下(即一个更新命令)?

编辑:

所以我们的想法是Products表只包含公司信息(没有产品信息),ProductDetails表包含1-8个产品/公司的信息。

因此,一个更新命令应该使用每个公司的ProductDetails表中的任何产品更新每一行的Products表(product1,product2 ... product8)。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

这绝对是一个糟糕的设计。 ProductID表中只应有一个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