другой союз все выбирая все строки, которые еще не были выбраны - PullRequest
0 голосов
/ 27 апреля 2011

Прямо сейчас у меня есть 2 оператора выбора, которые объединены объединением, которое я собирался сделать, возможно, назвал первый запрос, например, query1, а второй - query2, а затем в моем третьем запросе сделать, где bookno отсутствует в query1 или query2.,

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

Ответы [ 2 ]

0 голосов
/ 27 апреля 2011

просто оберните свою логику вокруг того, что вы написали:

select bookno 
where key not in (
your big select statement...
)
0 голосов
/ 27 апреля 2011

Как насчет использования WITH? Вы можете объявить свои запросы, присоединиться к ним с помощью UNION, и они будут искать те, которых там нет.

Посмотрите здесь: Множественный выбор операторов с помощью оператора «WITH» SQL Server 2005 . Это должно помочь вам начать работу.

Используя оператор WITH, вы изолируете логику ваших запросов, делая ваш запрос более понятным.

...