2017-01-07 2 views
0

두 테이블 CustomersOrders에 몇 가지 데이터가 있습니다.왼쪽 외부 조인을 사용하는 SQL Server 재귀 쿼리

SELECT * FROM Customers C; 

결과 :

CustomerId Name 
--------------------  
1   Shree; 
2   Kalpana; 
3   Basavaraj; 

검색어 : 결과

select * from Orders O; 

: 내가 고객 데이터를 채울 필요로하는 곳에 나는 비즈니스 요구 사항을

OrderId CustomerId OrderDate 
------------------------------------------------- 
100   1   2017-01-05 23:16:15.497 
200   4   2017-01-06 23:16:15.497 
300   3   2017-01-07 23:16:15.497 

는 외부 왼쪽 가입 반복되는 주문. 아래 쿼리 및 원하는 데이터를 작성했습니다.

SELECT * 
FROM Customers C 
LEFT OUTER JOIN 
    (SELECT * 
    FROM Orders 
    WHERE OrderId = 100) O ON O.CustomerId = C.CustomerId 

UNION ALL 

SELECT * 
FROM Customers C 
LEFT OUTER JOIN 
    (SELECT * 
    FROM Orders 
    WHERE OrderId = 200) O ON O.CustomerId = C.CustomerId 

UNION ALL 

SELECT * 
FROM Customers C 
LEFT OUTER JOIN 
    (SELECT * 
    FROM Orders 
    WHERE OrderId = 300) O ON O.CustomerId = C.CustomerId; 

원하는 결과 :

CustomerId Name  OrderId CustomerId OrderDate 
-------------------------------------------------------------------- 
1   Shree  100  1   2017-01-05 23:16:15.497 
2   Kalpana NULL  NULL  NULL 
3   Basavaraj NULL  NULL  NULL 
1   Shree  NULL  NULL  NULL 
2   Kalpana NULL  NULL  NULL 
3   Basavaraj NULL  NULL  NULL 
1   Shree  NULL  NULL  NULL 
2   Kalpana NULL  NULL  NULL 
3   Basavaraj 300  3   2017-01-07 23:16:15.497 

나는 루프에서 왼쪽 외부 쿼리를 넣고 통과에 OrderID를 마지막으로 결과 데이터를 저장하는 하나의 옵션을 가지고 있지만 그 때문에 기록의 높은 숫자의 많은 시간 소요 . 이 일을 끝내는 가장 좋은 방법을 알고 싶습니다. 나는 기능과 CTE를 시도했지만 지금까지는 운이 없다. 도와주세요.

미리 감사드립니다. 나는 데카르트 제품과 유사한 사용하여 솔루션을 가지고

SELECT C.*, 
     OrderId = CASE WHEN C.CustomerId = O.CustomerID THEN O.OrderId ELSE NULL END, 
     CustomerId = CASE WHEN C.CustomerId = O.CustomerID THEN O.CustomerId ELSE NULL END, 
     OrderDate = CASE WHEN C.CustomerId = O.CustomerID THEN O.OrderDate ELSE NULL END 
FROM Orders O, Customers C 
+0

더 좋은 방법으로 포맷 할 수 있으면 좋겠다. – sand

+0

포스트 코드, XML 또는 데이터 샘플을 편집하려면 ** 텍스트 편집기에서 해당 행을 강조 표시하고 편집기 툴바에서 "코드 샘플"버튼 ('{})을 클릭하여 멋지게 형식을 지정하고 구문을 강조 표시해야합니다! –

+0

질문이 명확하지 않습니다. 원하는 결과를 게시 한 결과입니까? –

답변

0

카티 제품은 작업을 할 수 있습니다. CustomerId를 테이블 변수에 저장하고 데카르트 생성을 동일하게 만듭니다. 이것은 내가 원하는대로 작동합니다.

declare @CustomerTable TABLE (ID int IDENTITY (1,1) NOT NULL, CustomerId int); @CustomerTable에 삽입하여 주문과 다른 CustomerId를 선택하십시오.

선택 v.ID, ISNULL CT_CustomerId, v.CustomerId, v.Name 오 등 (v.CT_CustomerId, o.CustomerId). * (CT_CustomerId, C.CustomerId 같은 CT.ID, CT.CustomerId을 선택 행 , @CustomerTable CT, 고객 C)에서 C.Name V 왼쪽 외부 조인 주문 O O.CustomerId = V.CustomerId 및 V.ID = o.ID

+0

친절한 도움을 준 Polux. 나는 당신의 개념을 사용하는 다른 솔루션을 알아 냈습니다. – sand