0

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

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

和一个产品详细信息表,如下所示:

ProductDetails (companyID int productID int)

对于每个 companyID,我的 ProductDetails 表(最多)有 8 行产品。

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

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

编辑:

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

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

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列。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 回答