我有一个名为Customer
的客户主表。这个表中的所有内容都来自一个名为Cust_Property
的键/值样式表。
Cust_Property
表有3列:
CustomerID, Property, Value
"Property
"列可能包含值为"John
"的First_Name
。有点像预旋转表。我需要用Cust_Property
表中相关的Property
列的值来更新Customer
表中的列。
- 如果在
Cust_Property
表中有一个新的CustomerID
,它将需要作为一个新的行添加到Customer
表中,以及所有适当的属性。 Customer
表中的所有数据也将在Cust_Property
表中。这意味着不是每个记录都需要更新。Customer
表中的记录只能添加/更新,不能删除。Property
表中有一些属性对应的列在Customer
表中不存在,所以这些属性就被忽略了。
DDL
CREATE TABLE #Customer
(
Customerid int,
FirstName varchar(50),
LastName varchar(50),
Address1 varchar(100),
Address2 varchar(100),
Address3 varchar(100)
)
CREATE TABLE #Cust_Property
(
CustomerID int,
Property varchar(50),
Value varchar(50)
)
INSERT INTO #Customer (Customerid, FirstName, LastName, Address1, Address2, Address3)
VALUES(1, N'John', N'Smith', N'123 happy lane', NULL, NULL);
INSERT INTO #Customer (Customerid, FirstName, LastName, Address1, Address2, Address3)
VALUES(2, N'Dwight', N'Schrute', N'33 1st Ave', N'Apt 5', NULL);
INSERT INTO #Customer (Customerid, FirstName, LastName, Address1, Address2, Address3)
VALUES(3, NULL, NULL, NULL, NULL, NULL);
INSERT INTO #Cust_Property (CustomerID, Property, Value)
VALUES(3, N'First_Name', N'Michael');
INSERT INTO #Cust_Property (CustomerID, Property, Value)
VALUES(3, N'Last_Name', N'Scott');
INSERT INTO #Cust_Property (CustomerID, Property, Value)
VALUES(8, N'First_Name', N'Jim');
INSERT INTO #Cust_Property (CustomerID, Property, Value)
VALUES(8, N'Last_Name', N'Halpert');
INSERT INTO #Cust_Property (CustomerID, Property, Value)
VALUES(8, N'Address1', N'644 Scranton Rd');
INSERT INTO #Cust_Property (CustomerID, Property, Value)
VALUES(8, N'Nickname', N'Jimmy');
INSERT INTO #Cust_Property (CustomerID, Property, Value)
VALUES(1, N'First_Name', N'John');
表:
Customer
CustomerID | FirstName | LastName | Address1 | 地址2 | 地址3 | 1 | 约翰道明> | 123幸福巷 | 2 |
---|---|---|---|---|---|
德怀特 | Schrute | 33 1号大街 | Apt 5 | ||
3 |
也许一个更新像-
UPDATE c
set c.[FirstName] = isnull(cp.[First_Name],c.[FirstName])
,c.[LastName] = isnull(cp.[Last_Name],c.[FirstName])
,c.[Address1] = isnull(cp.[Address1],c.[Address1])
FROM #Customer c
INNER JOIN (
SELECT *
FROM #Cust_Property tb
pivot(
max(value)
for Property in ( [First_Name],[Last_Name],[Address1],[Nickname])
)pv
)cp
on c.Customerid = cp.CustomerID