2017-10-09 2 views
0

개별 출력`두 테이블을 비교하고, I는 두 개의 테이블이 같은 값을 가질

CREATE TABLE Location (ID int ,Location Varchar(500)) 
    INSERT INTO Location values (1,'Loc3'),(2,'Loc4'),(3,'Loc5'),(4,'Loc7') 
    CREATE TABLE InputLocation (ID int ,Location Varchar(500)) 
    Insert into InputLocation values(1,'Loc1,Loc2,Loc3,Loc4,Loc5,Loc6') 

I 표 InputLocation 및 필요성 테이블 Location 각 값을 매칭시킴으로써 출력을 얻기 위해 필요한 바와 같이 결과를 디스플레이 2 테이블과 일치하지 중 출력, 즉 Loc1,Loc2,Loc6을 표시,이 같은 일부 코드를 시도하고 일했다하지만 난, 어떤 도움도 대단히 감사하겠습니다 더 간단한 코드가 필요

내 코드 :

SELECT STUFF((select ','+ Data.C1 
FROM 
(select 
    n.r.value('.', 'varchar(50)') AS C1 
from InputLocation as T 
cross apply (select cast('<r>'+replace(replace(Location,'&','&amp;'), ',', '</r><r>')+'</r>' as xml)) as S(XMLCol) 
cross apply S.XMLCol.nodes('r') as n(r)) DATA 
WHERE data.C1 NOT IN (SELECT Location 
       FROM Location) for xml path('')),1,1,'') As Output 
+0

두 table.without 관계 사이의 관계는 불가능합니다. 두 번째로 기술적으로 xml 경로를 사용하고 싶지 않은 이유를 기술적으로 명확히해야합니다. 성능 관련이 있다면, 미안합니다. 첫 번째 장소에서 요구 사항을 제대로 처리하지 못합니다. 다른 방법으로는 재귀 CTE가 될 수 있지만 성능은 최악입니다. – KumarHarsh

+0

id가 관계 –

+0

입니다. 성능이 나에게 우선적으로 우선적이지 않습니다. –

답변

0

사용 재귀 느린 XML 리더를 사용하지 않는 것이 :

;with tmp(DataItem, Location) as (
select cast(LEFT(Location, CHARINDEX(',',Location+',')-1) as nvarchar(50)), 
    cast(STUFF(Location, 1, CHARINDEX(',',Location+','), '') as nvarchar(50)) 
from [InputLocation] 
union all 
select cast(LEFT(Location, CHARINDEX(',',Location+',')-1) as nvarchar(50)), 
    cast(STUFF(Location, 1, CHARINDEX(',',Location+','), '') as nvarchar(50)) 
from tmp 
where Location > '' 
) 
select STUFF((SELECT ',' + x.Location 
from (
select DataItem as Location from tmp 
except Select Location from [Location]) x 
FOR XML path('')), 1, 1, '') AS OUTPUT 
+0

xpath 경로가 없으면 –

+0

이 필요합니다. 또한 InputLocation 값 (2, 'Loc3, Loc4')에 삽입하면 다음과 같이 확인해야 함을 의미하는 출력 –

+0

이 필요합니다. 두 번째 테이블 –

0

스크립트가 괜찮습니다.

또 다른 방법은 여기에서 설명하는대로 SPLIT String을 사용하는 것입니다. http://www.sqlservercentral.com/articles/Tally+Table/72993/

사용 [dbo가]. [DelimitedSplit8K]

개선하기 위해 내가 그것을 500 VARCHAR 대신 VARCHAR (8000) 만들어 내 쉼표로 구분 된 문자열이 다음 내 사용자 지정 UDF에 이상 500 이하 여야합니다 가정 공연.

SELECT STUFF((
      SELECT ',' + Data.item 
      FROM (
       SELECT il.ID 
        ,fn.item 
       FROM @InputLocation IL 
       CROSS APPLY (
        SELECT * 
        FROM dbo.DelimitedSplit2K(il.Location, ',') 
        ) fn 
       WHERE NOT EXISTS (
         SELECT * 
         FROM @Location L 
         WHERE l.Location = fn.Item 
         ) 
       ) data 
      FOR XML path('') 
      ), 1, 1, '') AS 
OUTPUT 
+0

그래도 고마워요,하지만 XML 경로가 없이는 그것도 필요합니다 –

+0

또한 InputLocation 값 (2, 'Loc3, Loc4')에 삽입하면 출력도 필요합니다. –

+0

두 번째 테이블에서 확인해야합니다. –

관련 문제