2015-10-17 54 views
0

我有“性”与动态值从行值的列创建一个表

ID Text 
----------- 
1  Name 
2  Surname 
3  D.O.B. 
4  City 

其它表的表与“人”

ID Code 
----------- 
1  MN0001 
2  ST0001 
3  ST0002 

而另一台“propertiesPeople”该联营公司那2张桌子。一个人可以有一个未定义数量的属性。

ID IDPerson IDProp Value 
---------------------------------- 
1  1   1   Peter 
2  1   2   Johnson 
3  2   1   John 
4  2   3   01/01/1977 
5  1   4   California 
6  3   1   Julian 
7  3   2   Ross 
8  3   4   Osaka 

插入人/人之前,我需要确认没有其他一个具有相同属性(验证特性是可变的,它会被存储在另一个表“propertiesToValidate”)

我想制作一个动态SQL使循环围绕“propertiesToValidate”的,这选择将完成类似:

SELECT p1.Value, p2.Value, p3.Value 
FROM properties p1 
INNER JOIN properties p2 ON p1.IDPerson=p2.IDPerson 
INNER JOIN properties p3 ON p1.IDPerson=p3.IDPerson 
WHERE p1.IDProp = 1 
AND p2.IDProp = 2 
AND p3.IDProp = 4 

而插入到这个时间表将完成这样的事情:

Value1  Value2 Value3 
-------------------------------- 
Peter  Johnson California 
Julian  Ross  Osaka 

之后,我会与一个表与要插入的新人/人相交。

我认为创建一个动态的字符串,然后用sp_executesql调用是不是一个优雅的方式来做到这一点(并且将来很复杂),但我无法实现另一种方式来做到这一点。有另一种方法吗?

回答

0

我只想补充UNIQUE约束:

CREATE TABLE #propertiesPeople(
    ID  VARCHAR(34) NOT NULL PRIMARY KEY 
    ,IDPerson INTEGER 
    ,IDProp INTEGER 
    ,Value VARCHAR(10) 
    ,UNIQUE(IDPerson, IDProp) 
); 
INSERT INTO #propertiesPeople(ID,IDPerson,IDProp,Value) VALUES ('1',1,1,'Peter'); 
INSERT INTO #propertiesPeople(ID,IDPerson,IDProp,Value) VALUES ('2',1,2,'Johnson'); 
INSERT INTO #propertiesPeople(ID,IDPerson,IDProp,Value) VALUES ('3',2,1,'John'); 
INSERT INTO #propertiesPeople(ID,IDPerson,IDProp,Value) VALUES ('4',2,3,'01/01/1977'); 
INSERT INTO #propertiesPeople(ID,IDPerson,IDProp,Value) VALUES ('5',1,4,'California'); 
INSERT INTO #propertiesPeople(ID,IDPerson,IDProp,Value) VALUES ('6',3,1,'Julian'); 
INSERT INTO #propertiesPeople(ID,IDPerson,IDProp,Value) VALUES ('7',3,2,'Ross'); 
INSERT INTO #propertiesPeople(ID,IDPerson,IDProp,Value) VALUES ('8',3,4,'Osaka'); 

当有人试图插入:

INSERT INTO #propertiesPeople(ID,IDPerson,IDProp,Value) VALUES ('9',3,4,'Osaka2'); 

将获得:唯一键约束的

违反“UQ __# propert__918436F84D776654' 。 无法在对象'dbo。#propertiesPeople'中插入重复键。 (3,4)。 重复键值是(3,4)。

LiveDemo

+0

的人会是一个新的。我不想创建一个新的人,例如创建3个新行: 9,4,1'Peter'|||| 9,4,2,Johnson |||| 9,4,4,'加州'。 要验证的属性的数量和值取决于另一个表。 – popiandro

+0

@popiandro那么分享这个表格的另一个例子 – lad2025

+0

这个表格只需要验证属性的ID(好吧,它会有更多的列,但对于这个问题并不重要) – popiandro