2009-05-08 1 views
1

두 테이블이 있다고 가정 해 봅시다 ... Foo and Bar. 여기에는 다음과 같은 데이터가 포함됩니다.T/SQL 퍼즐 - 관련없는 두 테이블에 대해 일대일 관계를 만들려면 어떻게 가입합니까?

Table Foo: 
Foo_Id 
------ 
100 
101 

Table Bar: 
Bar_Id 
------ 
200 
201 

각 테이블에는 두 개의 레코드가 있습니다. 이 두 테이블을 합쳐 두 레코드를 반환하는 방식으로 결합하고 싶습니다. 궁극적 인 목표는이 상태에서 관계가없는 경우에도 이러한 레코드에 대해 일대일 관계를 만드는 것입니다. 이 데이터의 결과는 테이블 Foo_Bar에 저장되어이 새로운 관계를 저장합니다.

이상적인 결과는 다음과 유사합니다.

Foo_Id Bar_Id 
------ ------ 
100  200 
101  201 

이 코드는 T/SQL 저장 프로 시저에서 사용됩니다. while 루프를 사용하면이 코드를 쉽게 작성할 수 있지만, 실제 응용 프로그램은 네 개의 레코드보다 훨씬 많은 데이터를 가지며 여러 사용자가 하루에 여러 번 호출 할 것이기 때문에 while 루프를 사용하지 않는 것이 좋습니다.

미리 감사드립니다.

편집 : 그것은 내가 피자 100 개 조각들이 피자 조각 싶은 말 100 명 재고 문제를 어느 정도 가지고 있어요

. Foo_Bar 테이블은 기본적으로 한 사람당 피자 한 조각을 할당하는 방법입니다. 테이블이 존재하고이 솔루션은 테이블에 대한 데이터를로드합니다.

+0

A). 나는 네가 네 질문에 답을 얻은 것 같아. 왜 당신은 하나가 존재하지 않는 관계를 만들고 싶습니까? 관계가 있고 적절히 모델링되어야하거나 그렇지 않아야합니다. – annakata

+0

데이터와 어떤 관련이 있습니까?어떤 Foo_Id가 Bar_Id와 함께 갈 수 있습니까? –

+0

재고 문제가 더 많거나 적습니다 ... 피자 100 조각과 피자 한 조각을 원하는 100 명이 있습니다. Foo_Bar 테이블은 기본적으로 한 사람당 피자 한 조각을 할당하는 방법입니다. 테이블이 존재하고이 솔루션은 테이블에 대한 데이터를로드합니다. – proudgeekdad

답변

5

처럼 뭔가를 할 수있는 피자를 획득하려면이 시도 :

declare @Foo table (Foo_Id int) 
INSERT INTO @Foo VALUES (100) 
INSERT INTO @Foo VALUES (101) 
declare @Bar table (Bar_Id int) 
INSERT INTO @Bar VALUES (200) 
INSERT INTO @Bar VALUES (201) 


SELECT 
    dt_f.Foo_Id 
     ,dt_f.RowNumber 
     ,dt_b.Bar_Id 
    FROM (SELECT 
       Foo_Id, ROW_NUMBER() OVER(ORDER BY Foo_Id) AS RowNumber 
       FROM @Foo 
     ) dt_f 
     INNER JOIN (SELECT 
         Bar_Id, ROW_NUMBER() OVER(ORDER BY Bar_Id) AS RowNumber 
         FROM @Bar 
        ) dt_b ON dt_f.RowNumber=dt_b.RowNumber 
2

선택 foo_id 후 순위에 가입 순위 함수와 중첩 SELECT 문 각 테이블

+0

이 샘플 데이터는 –

+0

에 대해서만 작동하며 원래 게시 된 문제에 대한 답변을 제공합니다. –

0

선택 (-100 bar_id) 내부 foo를 행 가 foo_id = ON 바 가입 bar_id.

당신이 준 예에서
select foo_id, bar_id 
from (select foo_id, rank() over (partition by foo_id order by foo_id) as [Rank] from foo) f 
left join (select bar_id, rank() over (partition by bar_id order by bar_id) as [Rank] from bar) b 
on f.Rank = b.Rank 
+0

주어진 샘플 데이터에서 실행될 때, 그것은 4 개의 행을 반환합니다. 제대로 작동하려면 "foo_id로 파티션"및 "bar_id로 파티션"을 제거해야합니다. 나는 같은 해결책을 사용하여 row_number()를 호출한다. 내 해결책을 보라. –

2

, 당신은 사실을 악용 할 수 있습니다 그 bar_id = 100 + foo_id

 
select foo.foo_id, bar.bar_id 
from foo inner join bar on foo.foo_id +100 = bar.bar_id 

..하지만 어쩌면 그것은 단지 단순화은 예에?

ID간에 ​​관계가 없으면 실제로 관계형 데이터이 아니며 관계형 데이터베이스에서 행을 쉽게 결합 할 수 없습니다.

이 경우 테이블 중 하나에 새 열을 추가하고 외래 키를 추가하여 데이터 이 관계형이되도록해야합니다.

+0

이것은 간단한 샘플 데이터 –

+0

에 대해서만 작동합니다. 대안의 두 번째 부분은 새로운 칼럼을 추가하는 것이지만 그다지 좋지는 않다는 것을 안다.) – codeulike

2

인벤토리 할당은 일반적으로 한 번에 한 행씩 수행됩니다. 세트를 사용하는 것은 좋지만 일종의 일괄 처리 패러다임입니다. 필자는 다양한 사람들이 인벤토리 테이블에서 피자를 구입할 것을 염두에 둡니다. Mssql에는 get-next-available-item 패턴에 대한 유용한 힌트가 있습니다. READPAST 힌트를 살펴보십시오. 당신이

UPDATE mytable WITH (READPAST) SET AcquiringUserID = @userId where AcquiringUserId is null 
+0

http://www.mssqltips.com/tip.asp 이런 종류의 접근법을 다루는 기사를 찾았습니까? 팁 = 1257 – ahains

관련 문제