首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工会和工会

工会和工会
EN

Stack Overflow用户
提问于 2019-08-04 16:59:06
回答 3查看 115关注 0票数 2

联合是给出了正确的结果,而联合则是给了错误的结果。

代码语言:javascript
复制
SELECT * 
  FROM (SELECT TOP 20 * 
          FROM noble_win 
         WHERE [YEAR ] = 1970 
           AND [SUBJECT   ]  NOT IN ('Economics', 'Chemistry') 
        ORDER BY [SUBJECT   ],[WINNER                ]) AS A
UNION
SELECT * 
  FROM (SELECT TOP 20 * 
          FROM noble_win 
         WHERE [YEAR ]=1970 
           AND [SUBJECT   ] IN ('Economics', 'Chemistry') 
        ORDER BY [SUBJECT   ],[WINNER                ]) AS B

这个查询首先给出行ChemistryEconomics,然后给出EconomicsChemistry以外的行。但是,我首先需要的是EconomicsChemistry以外的行。我不知道它为什么会产生错误的结果。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-04 17:00:27

必须在最外层的查询级别应用ORDER BY

代码语言:javascript
复制
select  * from 
(select top 20 *,1 AS ord from noble_win 
 where [YEAR ]=1970 and [SUBJECT   ]  NOT IN ('Economics', 'Chemistry')
 order by [SUBJECT   ],[WINNER                ]
)  as A
union 
select * from 
(select top 20 *, 2 AS ord from noble_win 
 where [YEAR ]=1970 and [SUBJECT   ] IN ('Economics', 'Chemistry')
 order by [SUBJECT   ],[WINNER                ]
) as B
order by ord, [SUBJECT   ],[WINNER                ])

你是DBA复仇竞赛的获胜者:空格标识符。

复仇: SQL!

命名约定

  • 预留
  • Blanks
  • 隐藏
  • 复制
  • Unicode
票数 7
EN

Stack Overflow用户

发布于 2019-08-04 17:09:26

您可以用CASE语句进行条件排序:

代码语言:javascript
复制
select * from (
  select top 20 * from noble_win 
  where [YEAR]=1970 and [SUBJECT] NOT IN ('Economics', 'Chemistry') 
  order by [SUBJECT], [WINNER]
) t1
union all
select * from (
  select top 20 * from noble_win 
  where [YEAR]=1970 and [SUBJECT] IN ('Economics', 'Chemistry')
  order by [SUBJECT], [WINNER] 
) t2
order by 
  case when [SUBJECT] NOT IN ('Economics', 'Chemistry') then 1 else 2 end,
  [SUBJECT], 
  [WINNER]
票数 0
EN

Stack Overflow用户

发布于 2019-08-04 19:52:59

如果使用union/union all,那么order by必须位于最外层的选择上。但是,你不需要它们。您只需使用表达式和窗口函数:

代码语言:javascript
复制
select nw.* 
from (select nw.*,
             row_number() over (partition by year,
                                             (case when [SUBJECT   ] in ('Economics', 'Chemistry') then 1 else 2 end)
                                order by [SUBJECT   ], [WINNER                ])
                               ) as seqnum
      from noble_win nw
     ) nw
where seqnum <= 20
order by (case when [SUBJECT   ] in ('Economics', 'Chemistry') then 1 else 2 end) desc,
         [WINNER                ]);

帮你改列名!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57348561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档