【问题标题】:another union all selecting all the rows that have not already been selected另一个联合全部选择所有尚未选择的行
【发布时间】:2011-04-27 13:25:15
【问题描述】:

现在我有 2 个 select 语句,它们由一个 union 连接,我想做的可能是将第一个查询命名为 query1 和第二个 query2,然后在我的第三个查询中执行 where bookno not in 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

【问题讨论】:

  • 嵌套查询中的 ORDER BY 在与 TOP 100 PERCENT 一起使用时会被优化掉。你可以把这两个扔掉。
  • 谢谢,有什么解决办法
  • @bugz:解决什么问题?你还没有问过问题。
  • 抱歉,我的意思是最好还是按不带百分比的普通选择取出订单
  • @bugz: 没什么区别,计划是一样的。这只是一个旁注。

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


【解决方案1】:

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

看看这里:Multiple Select Statements using SQL Server 2005 "WITH" Statement。它应该可以帮助您入门。

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

【讨论】:

    【解决方案2】:

    只需围绕您所写的内容进行逻辑包装:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 2021-09-18
      相关资源
      最近更新 更多