하나의 "단위"를 구성하는 일련의 테이블 (여러 개의 일 대 관계가 있음)이 있습니다. 나는 중복을 제거 할 필요가 있지만, 중복을 결정하려면 모든 데이터를 고려해야한다.중복 된 XML 노드 식별
문제가되는 DB는 여전히 SQL 2000 호환 모드이므로 더 이상 새로운 기능을 사용할 수 없습니다.
Create Table UnitType
(
Id int IDENTITY Primary Key,
Action int not null,
TriggerType varchar(25) not null
)
Create Table Unit
(
Id int IDENTITY Primary Key,
TypeId int Not Null,
Message varchar(100),
Constraint FK_Unit_Type Foreign Key (TypeId) References UnitType(Id)
)
Create Table Item
(
Id int IDENTITY Primary Key,
QuestionId int not null,
Sequence int not null
)
Create Table UnitCondition
(
Id int IDENTITY Primary Key,
UnitId int not null,
Value varchar(10),
ItemId int not null
Constraint FK_UnitCondition_Unit Foreign Key (UnitId) References Unit(Id),
Constraint FK_UnitCondition_Item Foreign Key (ItemId) References Item(Id)
)
Insert into Item (QuestionId, Sequence)
Values (1, 1),
(1, 2)
Insert into UnitType(Action, TriggerType)
Values (1, 'Changed')
Insert into Unit (TypeId, Message)
Values (1, 'Hello World'),
(1, 'Hello World')
Insert into UnitCondition(UnitId, Value, ItemId)
Values (1, 'Test', 1),
(1, 'Hello', 2),
(2, 'Test', 1),
(2, 'Hello', 2)
나는이 문제의 간단한 양식을 보여주는 SqlFiddle을 만들었습니다.
이 유닛은 정확히 세세한 일치 결합하는 단위 의 모든 단위 (비-ID) 필드 및 모든 조건을 중복으로 간주된다. XML을처럼 고려 - 다른 Unit
노드가 그 정확한 문자열
Select
Action,
TriggerType,
U.TypeId,
U.Message,
(
Select C.Value, C.ItemId, I.QuestionId, I.Sequence
From UnitCondition C
Inner Join Item I on C.ItemId = I.Id
Where C.UnitId = U.Id
For XML RAW('Condition')
) as Conditions
from UnitType T
Inner Join Unit U on T.Id = U.TypeId
For XML RAW ('Unit'), ELEMENTS
복사입니다 존재하지하지만이 문제가 I 있다는 것입니다 경우 Unit
노드 (단위 정보를 포함하고, 조건 하위 컬렉션) 고유 각 유닛이 새로운 레코드로 나타나게하는 XML을 얻지 못하는 것 같습니다. 중복을 찾기 위해 유닛 노드를 비교하는 방법을 모르겠습니다.
어떻게이 쿼리를 실행하여 컬렉션에 중복 노드 X이 있는지 확인할 수 있습니까?
원하는 출력을 추가 할 수 있습니까? – Tanner
출력 형식은별로 다르지 않지만 두 단위를 비교하고 고유성을 식별 할 수 있다면 모든 값을 가진 단일 문자열이든 모든 행이 결합 된 모든 열이 포함 된 큰 테이블 이건간에, 나는 상관하지 않는다. –
괜찮 았지 만 귀사의 산출물을 기반으로 고유성을 식별하는 방법이 확실하지 않으므로 공예품을 출력 할 수 있다면 출력을 생성하는 데 도움이 될 수 있습니다. – Tanner