2015-10-17 3 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'); 

Получит:

Нарушение UNIQUE KEY ограничение «ио __ # propert__918436F84D776654. Невозможно вставить дубликат ключа в объект 'dbo. # PropertiesPeople'. Значение дублирующего ключа равно (3, 4).

LiveDemo

+0

Человек был бы новый один. Я не хочу создавать нового человека, который создал бы, например, 3 новые строки: 9,4,1 'Peter' |||| 9,4,2, Johnson |||| 9,4,4, 'California'. Число и значение свойств для проверки зависят от другой таблицы. – popiandro

+0

@popiandro Итак, покажите пример этой другой таблицы, затем – lad2025

+0

В этой таблице будут только идентификаторы свойств для проверки (ну, у нее будет больше столбцов, но это не важно для вопроса) – popiandro

Смежные вопросы