我有一张产品表,如下所示:
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)。
答案 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