2011-09-16 6 views
-3

시간 이후 솔루션을 찾고 있지만 고양이가 그것을 얻습니다.더블 크로스 결과없이 SQL 자체 조인

내 테이블 :

ID   name   value1  value2 
1   Meyer   20   _ 
2   Schmitt  20   _ 
3   Berger  _   20 
4   Chief   _   20 

내 쿼리 :

SELECT A.ID, A.name AS nameA, B.name AS nameB, A.value1 
FROM table AS A INNER JOIN table AS B 
ON A.value1 = B.value2 

결과 :

ID  nameA  nameB  value1 
1  Meyer  Berger  20 
2  Schmitt  Chief  20 
,536,913,632 :

ID  nameA  nameB  value1 
1  Meyer  Berger  20 
1  Meyer  Chief  20 
2  Schmitt Berger  20 
2  Schmitt Chief  20 

이 같아야합니다 10

이 결과를 얻으려면 어떻게해야합니까?

나는 또한 GROUP BY A.name을 시도하지만 잘못된 결과를 얻을 :이 가입 기준 A.value1 = B.value2하고 입력 테이블에 따르면

ID  nameA  nameB  value1 
1  Meyer  Berger 20 
2  Schmitt Berger 20 
+0

도움이? 데이터베이스 정규화에 대해 읽어야합니다. – fluffy

+3

나는 당신이 기록을 어떻게 관련시키고 있는지 이해하지 못하고있다. 'value1'과'value2'의 값이 모두 20이라면, "Meyer"는 "Berger"와 "Schmitt"만이 "Chief"에 속한다고 어떻게 결정합니까? –

+0

이 작업을 수행하려면 다른 기준이 필요합니다. 예를 들어, 쿼리가 Meyer Berger 만 반환하고 Meyer Chief는 반환하지 않는 이유는 무엇입니까? – Phil

답변

2

당신은 지정하지 않은 DBMS를. 이것은 SQL 서버에서 테스트 :

with C as 
(
    select *, 
     row_number() over(partition by value1 order by ID) as rn1, 
     row_number() over(partition by value2 order by ID) as rn2 
    from YourTable 
) 
select A.ID, 
     A.name as nameA, 
     B.name as nameB, 
     A.value1 
from C as A 
    inner join C as B 
    on A.value1 = B.value2 and 
     A.rn1 = B.rn2 

시험 가능한 샘플 :

declare @T table 
(
    ID int, 
    name varchar(10), 
    value1 int, 
    value2 int 
) 
insert into @T values 
(1,   'Meyer',   20,   null), 
(2,   'Schmitt',  20,   null), 
(3,   'Berger',  null,  20), 
(4,   'Chief',   null,  20) 

;with C as 
(
    select *, 
     row_number() over(partition by value1 order by ID) as rn1, 
     row_number() over(partition by value2 order by ID) as rn2 
    from @T 
) 
select A.ID, 
     A.name as nameA, 
     B.name as nameB, 
     A.value1 
from C as A 
    inner join C as B 
    on A.value1 = B.value2 and 
     A.rn1 = B.rn2 
+0

Hej! 먼저 감사드립니다. 그것은 솔루션처럼 보이지만 죄송 합니다만 저는 sqlite로 작업하고 있습니다! 거기도 가능합니까? 나는 C를 보지 못했습니다 (...) 제게 설명해 주시겠습니까? 또한 sqlite에서 가능합니까? – airfrank

+0

@airfrank - 'with c as'는 공통 테이블 식입니다. 그게 sqlite에서 사용할 수 있는지 모르겠다. 그렇지 않으면 두 개의 하위 쿼리를 대신 사용할 수 있어야합니다. 당신은 또한 순위 함수 row_number()가 필요하고 sqlite에 관해서는 아무것도 알지 못하기 때문에 당신에게 말할 수있는 것은 없다. –

+0

감사합니다. row_number 팁으로 나를 올바르게 대답 해주었습니다! – airfrank

2

을, 마이어 버거 겸, 그리고 슈미트 모두 관련이있다 Berger와 Chief와 관련이 있습니다. 그래서 용의자는 당신이 우리에게 말하지 않는 것과 관련이있는 방법에 대한 기준/비즈니스 규칙에 더 있습니다. value1과 value2를 펑키 외래 키로 사용하고있는 것처럼 보입니다. Meyer가 Chief와 관련이 없다고 생각하는 이유, 또는 Schmitt가 Berger와 관련이없는 이유는 분명하지 않습니다.

ID   name   value1  value2 
1   Meyer   20   _ 
2   Schmitt  20   _ 
3   Berger  _   20 
4   Chief   _   20 

그래서 그것은 당신의 쿼리에 문제가 아니지만, 데이터 구조에 문제가, 는 그래서는 값 1과 값 2를 해결하자

ID   name   value1  value2 
1   Meyer   10   _ 
2   Schmitt  20   _ 
3   Berger  _   10 
4   Chief   _   20 

지금 올바른 결과를 얻을 수 있습니다. 그러나 전통적인 디자인과 같을 것이다 :

PersonId PersonName BossPersonId 
1   Meyer   3 
2   Schmitt  4 
3   Berger  _ 
4   Chief   _ 

를이 쿼리와 함께 :

Select A.Id, A.PersonName, B.PersonName as BossName 
FROM table AS A INNER JOIN table AS B 
ON A.BossPersonId= B.PersonId 
+0

Hej! 먼저 감사드립니다! 페어링에 신경 쓰지 않아! 나는 아무 것도 두 번 짝을 지어서는 안된다. 위의 설명에서 설명한대로. 어떤 아이디어? – airfrank

0

내가 지금 그것을 해결.

TABLE : 값만큼 임시 테이블 순서로에

ID  name   value1   value2 
1  Meyer  20    _ 
2  Muster  10    _ 
3  Heinz  20    _ 
4  Karl   _    20 
5  Max   _    20 
6  Zack   _    10 

분할을

표 A :

ID  name  value1  value2 
1  Muster  10   _ 
2  Meyer  20   _ 
3  Heinz  20   _ 

표 B : 다음

ID  name  value1  value2 
1  Zack  _    10 
2  Karl  _    20 
3  Max   _    20 

와 조인 A.ID = B.ID 및 A.value1 = B .ROWNUMBER와 값 2

포스트는 나에게 많이 들으 안부

정확하게 당신이 여기서 뭘하려고 무엇