从键/值样式属性表插入/更新客户表的更好方法?



我有一个名为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

tbody> <<tr>2
CustomerIDFirstNameLastNameAddress1地址2地址3
1约翰道明>123幸福巷
德怀特Schrute33 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

相关内容

  • 没有找到相关文章