2011-04-27 2 views
0

지금 당장 제가 깡충 뛰고있는 노동 조합에 의해 조인되는 2 개의 select 문은 query1과 같은 첫 번째 쿼리와 두 번째 query2를 이름 짓는 것이 었습니다. 내 세 번째 쿼리에서는 where1 또는 query2에 bookno가 없습니다.또 다른 공용체 모두 아직 선택되지 않은 모든 행을 선택합니다.

SELECT distinct t0.BOOKNO, t0.PaxName, t0.Locator, t0.FDATE7, 
          t0.BOARD, t0.ALIGHT, t0.AIRLINE, t0.FNUMBR, t0.DEP, 
          t0.ARR, t0.TOUR, t0.ROUTE, 
          t1.tour, t1.route, t1.sfrom , t1.sto,t1.seq,t0.seq, 'yes' 
    FROM  
     ( SELECT  TOP (100) PERCENT test.dbo.BNAMES.BOOKNO, RTRIM(test.dbo.BNAMES.SRNAME) + '/' + RTRIM(test.dbo.BNAMES.FIRST) + RTRIM(test.dbo.BNAMES.TITLE) 
          AS PaxName, test.dbo.PNRS.PNR AS Locator, test.dbo.PNRSECTORS.FDATE7, test.dbo.PNRSECTORS.BOARD, test.dbo.PNRSECTORS.ALIGHT, 
          test.dbo.PNRSECTORS.AIRLINE, test.dbo.PNRSECTORS.FNUMBR, test.dbo.PNRSECTORS.DEP, test.dbo.PNRSECTORS.ARR, test.dbo.BOOKINGS.TOUR, 
          test.dbo.BOOKINGS.ROUTE, test.dbo.BSTAGES.SEQ,(test.dbo.PNRSECTORS.BOARD + test.dbo.PNRSECTORS.ALIGHT) as both 
    FROM   test.dbo.BOOKINGS LEFT OUTER JOIN 
          test.dbo.BNAMES ON test.dbo.BOOKINGS.BOOKNO = test.dbo.BNAMES.BOOKNO LEFT OUTER JOIN 
          test.dbo.BSTAGES ON test.dbo.BNAMES.BOOKNO = test.dbo.BSTAGES.BOOKNO LEFT OUTER JOIN 
          test.dbo.PNRSECTORS ON test.dbo.BSTAGES.SCODE = test.dbo.PNRSECTORS.SKEY LEFT OUTER JOIN 
          test.dbo.PNRS ON test.dbo.PNRSECTORS.PNRKEY = test.dbo.PNRS.PNRKEY 
    WHERE  (test.dbo.BSTAGES.STYPE = 3) 
    ORDER BY test.dbo.BOOKINGS.BOOKNO, test.dbo.BNAMES.SEQ, locator 
    ) t0 
    INNER JOIN ( SELECT  TOUR, ROUTE, OFFSET, SEQ, SCODE, SFROM, STO, (SFROM + STO) AS BOTH 
    FROM   test.dbo.TSTAGES  
    ) t1   ON t1.tour = t0.tour and t1.route = t0.route and (t0.both = t1.both) 

    union all 


    SELECT distinct t0.BOOKNO, t0.PaxName, t0.Locator, t0.FDATE7, 
          t0.BOARD, t0.ALIGHT, t0.AIRLINE, t0.FNUMBR, t0.DEP, 
          t0.ARR, t0.TOUR, t0.ROUTE, 
          t1.tour, t1.route, t1.sfrom , t1.sto,t1.seq,t0.seq,'YES' 
    FROM  
     ( SELECT  TOP (100) PERCENT test.dbo.BNAMES.BOOKNO, RTRIM(test.dbo.BNAMES.SRNAME) + '/' + RTRIM(test.dbo.BNAMES.FIRST) + RTRIM(test.dbo.BNAMES.TITLE) 
          AS PaxName, test.dbo.PNRS.PNR AS Locator, test.dbo.PNRSECTORS.FDATE7, test.dbo.PNRSECTORS.BOARD, test.dbo.PNRSECTORS.ALIGHT, 
          test.dbo.PNRSECTORS.AIRLINE, test.dbo.PNRSECTORS.FNUMBR, test.dbo.PNRSECTORS.DEP, test.dbo.PNRSECTORS.ARR, test.dbo.BOOKINGS.TOUR, 
          test.dbo.BOOKINGS.ROUTE, test.dbo.BSTAGES.SEQ,(test.dbo.PNRSECTORS.BOARD + test.dbo.PNRSECTORS.ALIGHT) as both 
    FROM   test.dbo.BOOKINGS LEFT OUTER JOIN 
          test.dbo.BNAMES ON test.dbo.BOOKINGS.BOOKNO = test.dbo.BNAMES.BOOKNO LEFT OUTER JOIN 
          test.dbo.BSTAGES ON test.dbo.BNAMES.BOOKNO = test.dbo.BSTAGES.BOOKNO LEFT OUTER JOIN 
          test.dbo.PNRSECTORS ON test.dbo.BSTAGES.SCODE = test.dbo.PNRSECTORS.SKEY LEFT OUTER JOIN 
          test.dbo.PNRS ON test.dbo.PNRSECTORS.PNRKEY = test.dbo.PNRS.PNRKEY 
    WHERE  (test.dbo.BSTAGES.STYPE = 1) 
    ORDER BY test.dbo.BOOKINGS.BOOKNO, test.dbo.BNAMES.SEQ, locator 
    ) t0 
    INNER JOIN ( SELECT  TOUR, ROUTE, OFFSET, SEQ, SCODE, SFROM, STO, (SFROM + STO) AS BOTH 
    FROM   test.dbo.TSTAGES  
    ) t1   ON t1.tour = t0.tour and t1.route = t0.route and t1.seq = t0.seq and (t0.both = t1.both) 
    order by bookno 





    END 
+0

'주문 BY' 멀리 최적화되어 있습니다. 당신은 두 사람을 내쫓을 수 있습니다. – Quassnoi

+0

감사합니다 그래서 무엇이 해결책이 될 –

+0

@ bugz : 무엇에 대한 해결책? 아직 질문하지 않았습니다. – Quassnoi

답변

0

WITH를 사용하는 것은 어떻습니까? 당신은 쿼리를 선언하고, UNION으로 조인하고 거기에없는 것들을 검색 할 수 있습니다.

여기를 보시기 바랍니다 : Multiple Select Statements using SQL Server 2005 "WITH" Statement. 시작하는 데 도움이 될 것입니다.

WITH 문을 사용하면 쿼리의 논리를 분리하여 전반적인 쿼리를보다 쉽게 ​​이해할 수 있습니다.

+0

노동 조합에서 오류가 계속 발생합니다. –

0

당신이 쓴 주위에 당신의 논리를 포장 :`TOP 100 PERCENT`와 함께 사용하면 중첩 된 쿼리에

select bookno 
where key not in (
your big select statement... 
) 
관련 문제