如何在不排序的情况下执行UNION? (SQL)
UNION
连接两个结果并删除重复项,而 UNION ALL
不删除重复项。UNION
还对最终输出进行排序。
我想要的是没有重复且没有排序的 UNION ALL
。这可能吗?
这样做的原因是我希望第一个查询的结果位于最终结果的顶部,第二个查询位于底部(并且每个查询都像单独运行一样排序)。
UNION
joins two results and remove duplicates, while UNION ALL
does not remove duplicates.UNION
also sort the final output.
What I want is the UNION ALL
without duplicates and without the sort. Is that possible?
The reason for this is that I want the result of the first query to be on top of the final result, and the second query at the bottom (and each sorted as if they where run individually).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
我注意到这个问题得到了很多人的关注,所以我将首先解决一个您没有问的问题!
关于标题。要实现“Sql Union All with“distinct””,只需将
UNION ALL
替换为UNION
即可。这具有删除重复项的效果。对于您的具体问题,鉴于澄清“第一个查询应具有“优先级”,因此应从底部删除重复项”,您可以使用
I notice this question gets quite a lot of views so I'll first address a question you didn't ask!
Regarding the title. To achieve a "Sql Union All with “distinct”" then simply replace
UNION ALL
withUNION
. This has the effect of removing duplicates.For your specific question, given the clarification "The first query should have "priority", so duplicates should be removed from bottom" you can use
“UNION 还对最终输出进行排序” - 仅作为实现工件。它绝不保证执行排序,如果您需要特定的排序顺序,则应使用
ORDER BY
子句指定它。否则,输出顺序是服务器提供的最方便的顺序。因此,您对执行
UNION ALL
但删除重复项的函数的请求很简单 - 它称为UNION
。根据您的澄清,您似乎还认为
UNION ALL
会先返回第一个查询的所有结果,然后再返回后续查询的结果。这也无法保证。同样,实现特定顺序的唯一方法是使用 ORDER BY 子句指定它。"UNION also sort the final output" - only as an implementation artifact. It is by no means guaranteed to perform the sort, and if you need a particular sort order, you should specify it with an
ORDER BY
clause. Otherwise, the output order is whatever is most convenient for the server to provide.As such, your request for a function that performs a
UNION ALL
but that removes duplicates is easy - it's calledUNION
.From your clarification, you also appear to believe that a
UNION ALL
will return all of the results from the first query before the results of the subsequent queries. This is also not guaranteed. Again, the only way to achieve a particular order is to specify it using anORDER BY
clause.但真正的答案是:除了
ORDER BY
子句之外,排序顺序是任意的且无法保证。But the real answer is: other than the
ORDER BY
clause, the sort order will by arbitrary and not guaranteed.考虑这些表(标准 SQL 代码,在 SQL Server 2008 上运行):
期望的效果是按
col
升序对表A
进行排序,对表B
进行排序code> 按col
降序排列,然后将两者合并,删除重复项,保留合并之前的顺序,并将表A
结果与表B
放在“顶部”代码> 在“底部”,例如(pesudo代码)当然,这在 SQL 中不起作用,因为只能有一个
ORDER BY
子句,并且它只能应用于顶级表表达式(或任何的输出) SELECT
查询被称为;我称之为“结果集”)。首先要解决两个表之间的交集,在本例中为值
4
、5
和6
。交集如何排序需要在 SQL 代码中指定,因此设计者最好也指定这一点! (即在本例中提出问题的人)。这种情况下的含义似乎是交集(“重复项”)应该在表 A 的结果中进行排序。因此,排序后的结果集应如下所示:
注意 SQL 中的“top”和“bottom”没有推断含义和表(结果集除外)没有固有的顺序。另外(长话短说)请考虑
UNION
隐式删除重复行,并且必须在ORDER BY
之前应用。结论必须是,每个表的排序顺序必须通过在联合之前公开排序顺序列来显式定义。为此,我们可以使用ROW_NUMBER()
窗口函数,例如Consider these tables (Standard SQL code, runs on SQL Server 2008):
The desired effect is this to sort table
A
bycol
ascending, sort tableB
bycol
descending then unioning the two, removing duplicates, retaining order before the union and leaving tableA
results on the "top" with tableB
on the "bottom" e.g. (pesudo code)Of course, this won't work in SQL because there can only be one
ORDER BY
clause and it can only be applied to the top level table expression (or whatever the output of aSELECT
query is known as; I call it the "resultset").The first thing to address is the intersection between the two tables, in this case the values
4
,5
and6
. How the intersection should be sorted needs to be specified in SQL code, therefore it is desirable that the designer specifies this too! (i.e. the person asking the question, in this case).The implication in this case would seem to be that the intersection ("duplicates") should be sorted within the results for table A. Therefore, the sorted resultset should look like this:
Note in SQL "top" and "bottom" has no inferent meaning and a table (other than a resultset) has no inherent ordering. Also (to cut a long story short) consider that
UNION
removes duplicate rows by implication and must be applied beforeORDER BY
. The conclusion has to be that each table's sort order must be explicitly defined by exposing a sort order column(s) before being unioned. For this we can use theROW_NUMBER()
windowed function e.g.试试这个:
Try this:
该排序用于消除重复项,并且对于
DISTINCT
和UNION
查询是隐式的(但不是UNION ALL
) - 您仍然可以指定如果您需要按特定列对它们进行排序,则您希望按其排序的列。例如,如果您想按结果集排序,您可以引入一个附加列,然后首先按该列排序:
The sort is used to eliminate the duplicates, and is implicit for
DISTINCT
andUNION
queries (but notUNION ALL
) - you could still specify the columns you'd prefer to order by if you need them sorted by specific columns.For example, if you wanted to sort by the result sets, you could introduce an additional column, and sort by that first:
我假设你的表分别是table1和table2,
你的解决方案是;
I assume your tables are table1 and table2 respectively,
and your solution is;
1,1:
<代码>
从双选 1
union all 从对偶中选择 1
1:
<代码>
从双选 1
并从对偶中选择 1
1,1:
select 1 from dual
union all select 1 from dual
1:
select 1 from dual
union select 1 from dual
你可以做这样的事情。
You can do something like this.