2015-01-19 1 views
0

테이블이 두 개 있습니다. tblicencetbLicenceTypes입니다.다중 테이블 조인 작업에서 문제가 발생했습니다.

tbLicence는

tbLicenceTypes

같은 데이터를 포함

tbLicence가 두 feilds의 LicenceTypes을 갖는다

AgentId   LineOfAuthority     LicenceTypes 
.........  ....................    ................ 
287  Bail Bond,Casualty,Dental Services   1 
287  Casualty,Industrial Fire,Life    4 
287  Industrial Fire,Life      4 

tbLicenceTypes

같은 데이터를 포함 LicenceTypesX 세 필드 AgentId LineOfAuthority, LicenceTypes을 갖는다
LicenceTypes LicenceTypesX 
............ ............. 
    1   Producer 
    2   Sales Representative 
    3   Insurance Agent 
    4   Title Agent 

이제는 사기에 할당 된 모든 라이센스 유형을 가져오고 싶습니다. 나는 AgentId는 287이며, 당국의 라인 사상자는 ... 예상 출력은 ... 그것은 작동하지 않습니다 내가 코드 라인 아래에 시도이

LicenceTypes LicenceTypesX 
........... ............... 
     1   Producer 
     4   Title Agent 

같이해야 의미

;WITH cte AS (
SELECT 
    AgentId, 
    CAST('<r>' + REPLACE(REPLACE(LineOfAuthority,'&','&amp;'), ',', '</r> <r>') + '</r>' AS XML) AS LineOfAuthoritys 
FROM tbLicence 
) 
,FinalList AS (
SELECT 
AgentId, 
RTRIM(LTRIM (PTable.PColumn.value('.', 'VARCHAR(MAX)'))) AS LineOfAuthoritys 
FROM cte 
CROSS APPLY LineOfAuthoritys.nodes('//r') AS PTable(PColumn) 
) 
SELECT DISTINCT 
    T.LicenceTypes AS LicenceTypes , 
    F.LineOfAuthoritys AS LicenceTypesX 
    FROM FinalList F 
    CROSS APPLY (SELECT LicenceTypes FROM tbLicenceTypes TP WHERE   TP.LicenceTypesX = f.LineOfAuthoritys) AS T 
    WHERE F.LineOfAuthoritys = @LineOfAuthority 
    AND F.AgentId = @AgentId 
    ORDER BY T ASC 

제발 도와주세요 !!!

+0

결과보기 : "그것은 작동하지 않는다"? – Jens

+0

귀하의 desc에 따라. 당신은 단지 "4 - 타이틀 에이전트"결과만을 얻습니다. 어떻게 "1 - 프로듀서"가 결과에 올 것입니까? 귀하의 항목을 확인하십시오. – Ajay2707

+0

사실 나는 위의 코드를 작업하기 위해 태클을하고 있었고 ... 제발 도와주세요! – Nida

답변

1

SAMPLE 표

CREATE TABLE #tbLicence (AgentId INT, LineOfAuthority VARCHAR(200), LicenceTypes INT) 

INSERT INTO #tbLicence 
SELECT 287, 'Bail Bond,Casualty,Dental Services',1 
UNION ALL 
SELECT  287, 'Casualty,Industrial Fire,Life',4 
UNION ALL 
SELECT  287, 'Industrial Fire,Life',4 

CREATE TABLE #tbLicenceTypes(LicenceTypes INT, LicenceTypesX VARCHAR(200)) 

INSERT INTO #tbLicenceTypes 
SELECT 1, 'Producer' 
UNION ALL 
SELECT  2, 'Sales Representative' 
UNION ALL 
SELECT  3, 'Insurance Agent' 
UNION ALL 
SELECT  4, 'Title Agent' 

QUERY

;WITH cte AS 
(
    SELECT 
    AgentId,LicenceTypes, 
    CAST('<r>' + REPLACE(REPLACE(LineOfAuthority,'&','&amp;'), ',', '</r> <r>') + '</r>' AS XML) AS LineOfAuthoritys 
    FROM tbLicence 
) 
,FinalList AS (
    SELECT 
    AgentId,LicenceTypes, 
    RTRIM(LTRIM (PTable.PColumn.value('.', 'VARCHAR(MAX)'))) AS LineOfAuthoritys 
    FROM cte 
    CROSS APPLY LineOfAuthoritys.nodes('//r') AS PTable(PColumn) 
) 
SELECT DISTINCT 
    L.LicenceTypes AS LicenceTypes , 
    L.LicenceTypesX AS LicenceTypesX 
    FROM FinalList F 
    JOIN tbLicenceTypes L ON F.LicenceTypes=L.LicenceTypes 
    WHERE F.LineOfAuthoritys = 'Casualty' 
    AND F.AgentId = 287 
    ORDER BY L.LicenceTypesX ASC 
+0

업데이트했습니다. @Nida –

+0

고마워요. 선생님 ... 우수 솔루션 !!! – Nida

+0

당신은 환영합니다. 언제든지 수정이 필요합니다. @Nida –

0

LineOfAuthority는 추가 테이블을 사용하여 다 대다 관계로 다시 설계해야합니다. 그것이 끝나면, 쿼리는 쉬운 일이 될 것입니다. 어떻게 다 - 대 - 다 관계를 만드는 지 모른다면 RDBMS에 대한 좋은 책을 먼저 읽는 것이 좋다.

+0

이 디자인이 좋지 않다는 것을 알고 있습니다 ... 다른 개발자가 설계했습니다 ... 테이블을 다시 디자인 할 수는 없습니다 ... 프로젝트의 다른 모듈에서 코딩 부분을 재 작업하는 데 시간이 오래 걸릴 것입니다. – Nida

관련 문제