2013-06-08 3 views
0

안녕과 SQL Server의 두 테이블을 조인하는 방법내가 두 테이블 A와 B가 밖으로 중복

표 A :

Order    Drop off 
100    Oakvile 
100    Hamilton 
100    Milton 

날 방법을 알려 주시기 바랍니다

Order  Pick up 
100   Toronto 
100   Mississauga 
100   Scarborough 

표 B 이 출력을 얻을 수 있습니까 (즉, A의 오른쪽에있는 B의 필드에 가입하고 싶음)

Order pickup  Dropoff 
100  Toronto  oakvile 
100  Mississauga Hamilton 
100  Scarborough Milton 

같은 쿼리를 쓸 수있는 방법은 무엇입니까? a.rownum = b.rownum하지만 행운은 없습니다.

+7

테이블은 본질적으로 순서가 있습니다. 순서를 지정하려면 id, 행 번호 또는 작성 날짜와 같은 필드가 필요합니다. 그렇지 않으면 모든 솔루션이 작동하지 않을 수 있습니다. –

+0

DISTINCT 문을 사용 하시겠습니까? http://www.w3schools.com/sql/sql_distinct.asp – Max

답변

1

으로 영업 이익RDBMS

내가 그의 RDBMSSQL SERVER 2008 촬영을 위해 자유를 복용하고 언급하지 않았다. OP가 다음 쿼리를 다른 RDBMS으로 쉽게 변환 할 수 있습니다.

select A.[Order], 
    ROW_NUMBER() OVER(ORDER BY A.[Pick up]) rn1, 
    A.[Pick up] 
    into A1 
FROM A 
; 
select B.[Order], 
    ROW_NUMBER() OVER(ORDER BY B.[Drop off]) rn2, 
    B.[Drop off] 
    into B1 
FROM B 
; 
Select A1.[Order], 
    A1.[Pick up], 
    B1.[Drop off] 
FROM A1 
INNER JOIN B1 on A1.rn1=B1.rn2 

SQL FIDDLE to Test

0

은 내가 ROW_NUMBER의 윈도우 기능과 함께 CTE를 사용하십시오.

WITH keyed_A AS (
    SELECT 
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS id 
    ,[Order] 
    ,[Pick Up] 
    FROM A 
), keyed_B AS (
    SELECT 
    ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS id 
    ,[Order] 
    ,[Drop Off] 
    FROM B 
) 
SELECT 
    a.[Pick Up] 
    ,b.[Drop Off] 
    FROM keyed_A AS a 
    INNER JOIN keyed_B AS b 
    ON a.id = b.id 
; 

CTE

은 두 테이블 교차 ID가 가상 테이블로 간주 될 수있다. Windowing 함수가있는 OVER 절 ROW_NUMBER을 사용하여 CTE에 ID를 만들 수 있습니다. 우리는 레코드의 물리적 인 저장 공간에 의존하기 때문에 (좋은 생각이 아니기 때문에 테이블에 키를 추가하십시오.) 우리는 ORDER BY (SELECT NULL)를 사용하여 읽기만하면됩니다.

SQLFiddle to test

1

rownum에서 오라클을 사용하고 있다고 가정합니다. 나는이 보일 수도 있지만이 작동하는 것을 강조한다

select a.Order as "order", a.Pickup, b.DropOff 
from (select a.*, rownum as seqnum 
     from a 
    ) a join 
    (select b.*, rownum as seqnum 
     from b 
    ) b 
    on a.order = b.order and a.seqnum = b.seqnum; 

(그리고 작은 예에 작동합니다) (이 모든 주문이 정확히 일치한다고 가정합니다.) 다음과 같은 시도 할 수 있습니다 그것은 일반적으로 작동하지 않습니다. 또한 레코드를 삭제 한 데이터에는 작동하지 않습니다. 그리고 아마도 병렬 시스템에서는 작동하지 않을 것입니다. 소량의 데이터가있는 경우 Excel에서 데이터를 버리고 거기에서 작업하는 것이 좋습니다. 이렇게하면 쌍이 의미가 있는지 확인할 수 있습니다. 또한

, 당신은 순서를 지정하는 열이있는 경우, 다음 기본적으로 같은 구조는 작동합니다 : SQL에서

select coalesce(a.Order, b.Order) as "order", a.Pickup, b.DropOff 
from (select a.*, 
      row_number() over (partition by "order" order by <ordering field>) as seqnum 
     from a 
    ) a join 
    (select b.*, 
      row_number() over (partition by "order" order by <ordering field>) as seqnum 
     from b 
    ) b 
    on a.order = b.order and a.seqnum = b.seqnum; 
+0

그 작품은 정말 고마워. – user2466648

관련 문제