2016-10-27 2 views
2

이름 부분에 대한 열을 포함하는 2 개의 테이블이 있습니다. 즉, John Doe에는 John 행과 Doe 행이 있습니다. 2 개의 테이블은 서로 다른 이름을 가지고 있습니다. 하나의 테이블에서 이름 부분을 가져 와서 다른 부분의 이름 부분에 대한 차이점을 계산해야합니다. 지금은 두 개의 테이블 각각을 반복하는 내부 및 외부 커서를 사용하고 있습니다. 이 작동하지만 실행하는 데 오랜 시간이 걸립니다.2 테이블의 이름 열 사이의 SQL 차이 함수

속도를 높이는 다른 방법이 있습니까?

내가 할 노력하고있어의 예 :

표 1

Name 
---- 
John 
Doe 
Jan 
Smith 

표는 내가 필요로 무엇을 2

Name 
----- 
Henry 
Ford 
Ransom 
Eli 
Olds 

:

DIFFERENCE('John','Henry') 
DIFFERENCE('John','Ford') 
DIFFERENCE('John','Ransom') 
DIFFERENCE('John','Eli') 
DIFFERENCE('John','Olds') 
DIFFERENCE('Doe','Henry') 
DIFFERENCE('Doe','Ford') 
DIFFERENCE('Doe','Ransom') 
DIFFERENCE('Doe','Eli') 
DIFFERENCE('Doe','Olds') 
DIFFERENCE('Jane','Henry') 
DIFFERENCE('Jane','Ford') 
DIFFERENCE('Jane','Ransom') 
DIFFERENCE('Jane','Eli') 
DIFFERENCE('Jane','Olds') 
DIFFERENCE('Smith','Henry') 
DIFFERENCE('Smith','Ford') 
DIFFERENCE('Smith','Ransom') 
DIFFERENCE('Smith','Eli') 
DIFFERENCE('Smith','Olds') 

지금이 차이점을 저장합니다. sco 테스트를 위해 임시 테이블에 res. 형식이 지정되지 않아서 죄송합니다. 여기 게시하는 것이 처음입니다. 도와 주셔서 감사합니다.

+1

그래서 정확히 문제는 무엇인가는? – Mureinik

+0

28,000 개가 넘는 레코드가있는 테이블이 하나 있는데 5,000 개가 넘는 다른 테이블과 비교하고 있습니다. 내가 수학을 잘못하지 않으면, 합쳐진 기록이 160,000,000 개가 넘을 것이며 처리하는데 3.5 시간이 걸릴 것입니다. 소요될 수있는 시간을 줄이는 더 빠른 프로세스가 있습니까? 감사. – carl20236

+0

@ carl20236 오히려 여기 새로 왔으므로 (Btw : 환영합니다!) 한 가지 힌트를 허용하십시오. (최고) 응답 표 카운터 아래에서 수락 확인을 체크하는 것은 매우 친절합니다. 이것은 1)이 이슈를 해결 된 것으로 표시 할 것입니다. 2) 추종자가 가장 좋은 해결책을 쉽게 찾을 수 있도록합니다. 3) 응답자에게 포인트를 지불하고 4) 포인트를줍니다. 15 포인트의 경계를 넘어 가면 추가로 기부금에 투표하게됩니다. 이것은 당신을 감사하는 SO 방법입니다. 해피 코딩! – Shnugo

답변

2

데카르트 조인 또는 교차 결합을 사용할 수 있습니다.

SELECT DIFFERENCE(t1.Name, t2.Name) 
FROM Table1 t1 
CROSS JOIN Table2 t2 

For Reference

5

내가 생각 - 당신이 실제로 찾고있는 무엇을 - CROSS JOIN입니다.

즉, 모두 합치기 조인은 조인 조건이 필요 없습니다. 결과는 각각 가능한 조합의 값, 다시 말하면 카티 션 제품입니다.

이 시도 :

DECLARE @tbl1 TABLE(Name VARCHAR(100)); 
INSERT INTO @tbl1 VALUES 
('John') 
,('Doe') 
,('Jan') 
,('Smith'); 

DECLARE @tbl2 TABLE(Name VARCHAR(100)); 
INSERT INTO @tbl2 VALUES 
('Henry') 
,('Ford') 
,('Ransom') 
,('Eli') 
,('Olds'); 

SELECT t1.Name 
     ,t2.Name 
     ,DIFFERENCE(t1.Name,t2.Name) AS DiffName 
FROM @tbl1 AS t1 
CROSS JOIN @tbl2 AS t2 

결과 다음

Name Name DiffName 
John Henry 2 
Doe  Henry 2 
Jan  Henry 2 
Smith Henry 2 
John Ford 2 
Doe  Ford 2 
Jan  Ford 2 
Smith Ford 2 
John Ransom 1 
Doe  Ransom 0 
Jan  Ransom 1 
Smith Ransom 1 
John Eli  2 
Doe  Eli  2 
Jan  Eli  2 
Smith Eli  1 
John Olds 0 
Doe  Olds 0 
Jan  Olds 0 
Smith Olds 1 
+0

은 문서화되어 코드 및 결과를 테스트 할 준비가되었습니다. 또 다른 방법은 :'SELECT T1.Name, T2.Name, DIFFERENCE (T1.Name, T2.이름) AS '차이' FROM (VALUE ('John'), ('Doe'), ('Jan'), ('Smith')) T1 (이름) CROSS JOIN (VALUES ('Henry'), – Salvador

0

도 간단을 작성하는 또 다른 방법이다 :

SELECT table1.name, table2.name, DIFFERENCE(table1.Name, table2.Name) 
FROM table1, table2 
+3

쉼표로 구분 된'FROM' 소스를'WHERE '없이 간단하게 쉼표로 구분 한 목록이 정확하다는 것입니다 (예 :'Ford ','Ransom ','Eli ','Olds ' '-clause는'CROSS JOIN'과 완전히 똑같을 것이다. 그러나 'CROSS JOIN'을 선호해야하는 예가 있습니다. 특히 조인을 추가하거나 'APPLY'하는 경우 특히 그렇습니다. 이것은 * 더 단순한 경우 * 실제로 취향의 문제입니다 ... – Shnugo

+0

@ Shnugo 예제는 무엇입니까? – kbball

+0

내 대답의 전체 코드를 사용하고 'CROSS APPLY (SELECT t1.Name + t2.Name AS Combined) AS x' 행을 하나 더 추가하십시오. 선택 목록에'x.Combined'를 추가하십시오. 이렇게하면 두 이름이 연결되어 표시됩니다. 이제 쉼표로 시도해보고 범위 밖에서't1.Name'을 찾으십시오. – Shnugo