order by 和union all 如何共存

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了order by 和union all 如何共存相关的知识,希望对你有一定的参考价值。

类似如下的sql:
Select id,cc,dd from A
union all
select id ,cc,dd from B
order by id,
如果我只想按照 表A 中的id 来排列,并且要把把表B 的记录放在最后,该如何做?谢谢

在SQL语句中,UNION关键字多用来将并列的多组查询结果(表)合并成一个结果(表),简单实例如下:
SELECT [Id],[Name],[Comment] FROM [Product1]
UNION
SELECT [Id],[Name],[Comment] FROM [Product2]
上面的代码可以实现将从Product1和Product2两张表合并成一个表。
参考技术A 这个如果是sqlserver2005以上版本的话,可以在A表处使用row_number()函数创建排序行号
然后union all b表的数据,可以用一个较大值充当行号如100000
最后以行号进行排序即可来自:求助得到的回答本回答被提问者采纳
参考技术A 需要排序的再嵌套一下:
select id,cc,dd from (Select id,cc,dd from A order by id)
union all
select id ,cc,dd from B
参考技术B select id,cc,dd
from (
Select id,cc,dd from A
union all
select id ,cc,dd from B
)
order by id追问

sorry,这样的结果貌似不能保证表B 的记录放在结果集的最后,我试过了,谢谢

追答

select id,cc,dd
from (
select id,cc,dd ,tt
from
(Select id,cc,dd,1 tt from A
union all
select id ,cc,dd,2 tt from B
)
order by tt , id
)

那就加个排序字段啊

如何使用 SQLite 使用 UNION ALL 和 ORDER BY 进行排序

【中文标题】如何使用 SQLite 使用 UNION ALL 和 ORDER BY 进行排序【英文标题】:How to sort using UNION ALL and ORDER BY using SQLite 【发布时间】:2013-06-04 06:23:21 【问题描述】:

我在 android 的 SQLite 数据库中有一些数据。我想使用 WHERE 子句使用 LIKE 和 NOT LIKE 条件从数据库中检索数据。我正在使用 UNION ALL 命令组合两个语句。为此,查询是

SELECT * FROM TABLENAME WHERE column_name LIKE SOMTHING.

这将返回一些行。然后我正在写查询

SELECT * FROM TABLENAME WHERE column_name NOT LIKE SOMTHING.

这将返回剩余的行。

我想先返回第一个查询项,然后再返回第二个查询项。这可以通过使用 UNION ALL 命令来实现。所以查询就像

 db.rawQuery("SELECT * FROM TABLENAME WHERE column_name LIKE SOMTHING UNION ALL SELECT * FROM TABLENAME WHERE column_name NOT LIKE SOMTHING")

但我希望在第一个查询项目/项目之后和之后按排序顺序排列第二个查询项目。所以我写了这样的查询

 db.rawQuery("(SELECT * FROM TABLENAME WHERE column_name LIKE SOMTHING) UNION ALL (SELECT * FROM TABLENAME WHERE column_name NOT LIKE SOMTHING ORDER BY column_name)")

我需要该表中的所有数据,但首先我希望不需要排序的第一个查询返回的行,但在这些行之后,我希望所有行(不喜欢)按排序顺序, 我以排序形式获取所有数据,在第一个位置它没有返回第一个查询的行(在联合所有之前)

任何人都可以帮助我解决这个问题。提前致谢。

【问题讨论】:

什么实际上不起作用?在您的最后一个代码中,您只在联合之后对查询进行排序,而不是在联合之前对查询进行排序,这是问题所在吗? 我需要该表中的所有数据,但首先我希望不需要排序的第一个查询返回的行,但在这些行之后,我希望所有行(不喜欢的)按排序顺序,我是以排序形式获取所有数据,在第一个位置它不返回第一个查询的行(在联合所有之前) 首先你可能需要理解这样的封顶句子看起来很粗鲁。然后,如果您正在复制您在应用程序中编码的内容,那么您在查询末尾缺少 1 个右括号,请检查添加它是否可以解决您的问题。 我很抱歉我的错误。我不是从我的代码中复制这个。现在我编辑了我的帖子。 该代码应该可以工作,至少它可以在我的应用程序中工作。所谓的“column_name”是文本中的主键吗?因为如果是这样,数据库本身可能会将其用作索引机制之类的东西,因此它将自动按字母顺序排序。不太确定很难,如果这符合您的情况,请尝试使用一些自动增量 ID 作为主键。 【参考方案1】:

您只能订购整个结果。

这意味着您必须引入一个虚拟列才能将记录与子查询区分开来:

SELECT *, 0 AS SubQueryNr FROM TableName WHERE column_name LIKE ?
UNION ALL
SELECT *, 1               FROM TableName WHERE column_name NOT LIKE ?
ORDER BY SubQueryNr, column_name

或者,只需使用LIKE 条件进行排序:

SELECT * FROM TableName
ORDER BY column_name LIKE ? DESC

【讨论】:

感谢您的建议。我们将服务器中的数据从我们获取数据的位置排序到数据库。所以不需要对查询进行排序。再次感谢您的帮助

以上是关于order by 和union all 如何共存的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQLite 使用 UNION ALL 和 ORDER BY 进行排序

如何在 union all 中使用 order by

在android中使用UNION ALL时如何对特定语句使用order by

Rails - “union all”之后的“order by”

提高性能 union all+group by+order by+count

在 MySQL 中使用 Union All 和 Order By