另一个联合都选择了尚未被选中的所有行

时间:2011-04-27 13:25:15

标签: sql sql-server-2005 stored-procedures

现在我有两个由联盟加入的选择语句,我正在跳跃做的可能是命名第一个查询,如query1,第二个查询,然后在我的第三个查询中做一个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 :(得分:0)

使用WITH怎么样?您可以声明查询,将它们与UNION连接,然后搜索那些不存在的查询。

看看这里:Multiple Select Statements using SQL Server 2005 "WITH" Statement。它应该可以帮助你开始。

通过使用WITH语句,您将隔离查询的逻辑,使您的整体查询更容易理解。

答案 1 :(得分:0)

只是围绕你写的内容包装你的逻辑:

select bookno 
where key not in (
your big select statement...
)