2015-01-13 2 views
0

조건부로 쿼리를 조인하고 싶습니다.조건부로 쿼리에 가입

쿼리 :

SELECT Part, MtlPart, Qty 
FROM Mtl 

결과 :

Part  MtlPart  Qty 
    1   100   1 
    1   101   2 
    1   102   2 
    2   200   1 
    2   201   1 
100   120   1 
100   121   1 
100   122   1 
120   A20   1 
120   A21   1 

MtlParts 또한 부품이다. 내가 뭘하고 싶은지는이 쿼리를 자체에 연결하여 연결 파트 목록을 얻는 것입니다. 예를 들어

: 조인 된 쿼리는 널 (null)을 반환 할 때까지

a.Part  a.MtlPart  a.Qty  b.Part  b.MtlPart b.Qty 
     1   100   1   100   120   1 
     1   100   1   100   121   1 
     1   100   1   100   122   1 
     1   101   1   NULL  NULL  NULL 
     1   102   1   NULL  NULL  NULL 

내가 자체에이 쿼리를 가입하려면 :

SELECT * 
FROM 
    (SELECT Part, MtlPart, Qty 
    FROM Mtl) AS A 
INNER JOIN 
    (SELECT Part, MtlPart, Qty 
    FROM Mtl) AS B 
ON a.MtlPartNum = b.PartNum 
WHERE Part = 1 

는 다음과 같은 결과를 리턴합니다. 이 예제에서 파트 1은 파트로 나열되지 않았으므로 MtlParts A20 및 A21에 도달 할 때까지 데이터를 리턴합니다.

솔직히 최선을 다하고 있습니다. 어떤 도움이나 충고라도 대단히 감사하겠습니다.

+0

설명하는 것은 당신이 추구해야하는 것이 아닙니다. 이와 같이 동적 인 컬럼을 사용하면 존재하지 않는 컬럼을 호출하려고 할 때 문제가 발생할 수 있습니다. 1) 오직 X 중첩 된 레벨로 이동하거나 2) 하위 파트가있을 때만 식별하고 데이터 세트의 필터 뒤에있는 코드를 통해 목록의 하위 파트를 찾는 작업 만 처리해야합니다. – KHeaney

+0

@KHeaney 옵션 1은 내가 달성하고자하는 것이지만 루프를 작성하는 방법으로 고심하고 있습니다. 어떤 제안? – user2572833

답변

1

을 다음에서 선택 서브 테이블. 그것은 당신의 예에 따라 다음과 같아야합니다

SELECT A.Part  As APart, 
     A.MtlPart As AMtlPart, 
     A.Qty  As AQty, 
     B.Part  As BPart, 
     B.MtlPart As BMtlPart, 
     B.Qty  As BQty, 
     C.Part  As CPart, 
     C.MtlPart As CMtlPart, 
     C.Qty  As CQty, 
FROM Mtl AS A 
    Left Outer JOIN Mtl AS B 
     ON A.MtlPartNum = B.Part 
    Left Outer JOIN Mtl AS C 
     ON B.MtlPartNum = C.Part 
WHERE A.Part = 1 

이것은 당신이 어떻게 보이는지 깊은 증가시킬 수 Joins을 추가하여 결과가

APart  AMtlPart AQty BPart  BMtlPart BQty CPart CMtlPart CQty 
1   100  1  100  120  1  120  A20  1 
1   100  1  100  120  1  120  A21  1 
1   100  1  100  121  1  Null Null  Null 
1   100  1  100  122  1  Null Null  Null 
1   101  1  Null  Null  Null Null Null  Null 
1   102  1  Null  Null  Null Null Null  Null 

를 설정 생산할 것입니다. 내 코멘트에서 언급했듯이, 당신은 이것을 동적으로해서는 안됩니다. 즉, 작성하는 조인의 수에 제한을 두어야하므로 파트의 하위 파트를 몇 개보아야하는지 알고있는 경우이 방법이 가장 효과적입니다.

+0

불행히도 필요한 중첩 수준의 수는 다양합니다. 이것은 현재 코드와 유사하며 올바르게 작동하지만 루프를 만드는 방법을 찾고있었습니다. 그것이 가능한지 확실하지 않았습니다. 도움을 주셔서 감사 드리며 동적으로이 작업을 수행하는 방법을 찾으신다면 알려주십시오. – user2572833

1

내부 조인이 아닌 외부 조인이 필요한 것처럼 보일지라도 쿼리는 합리적인 방식으로 보입니다. 나는 하위 쿼리를 제거하고 별칭을 추가합니다 : 당신은 단지 당신이 단순히 각 수준에 대한 자체에 여러 번 테이블에 다시 가입해야 중첩 수준의 제한된 수의 이동하려면

SELECT a.Part, a.MtlPart, a.Qty, b.Part, b.MtlPart, b.Qty 
FROM Mtl A LEFT JOIN 
    Mtl B 
    ON a.MtlPartNum = b.PartNum 
WHERE A.Part = 1;