【问题标题】:Stack query results in one query result so the order of rows depends on which part returns which result堆栈查询结果为一个查询结果,因此行的顺序取决于哪个部分返回哪个结果
【发布时间】:2021-11-14 13:11:43
【问题描述】:

我想知道的是,您是否可以接受两个查询并将它们有序地表示在一个结果集中。

所以在示例中我们进行两个查询:

Select a.col1, a.col2 from a where a.col3 = 1 Order By a.col2

Select a.col1, a.col2 from a where a.col4 = 0 Order By a col2

我知道在这种情况下将两个查询合并为一个非常容易:

Select a.col1, a.col2
from a
where a.col3 = 1 and a.col4 = 0 Order By a col2

但结果行的顺序现在将在第一个和第二个查询之间混合。

而我正在寻找一个顺序,我首先获得所有第一个查询结果,然后获得所有第二个查询结果

我还看到您可以通过按 col3 和 col4 排序来轻松解决此示例。但我希望你能看到,这并不能解决给定的许多其他条件。

也许没有通用的方法,但我不知道可以使用的所有功能,而且我在编写查询命令方面并不是很先进

谢谢。

【问题讨论】:

  • 您的组合尝试在逻辑上不正确 - 您看到了吗?您是否也意识到可以在两个结果集中出现同一行?在这种情况下,您期望什么?请不要仅仅放弃这永远不会发生的想法。如果你想假设,那么明确假设并记录在你的查询代码中(cmets 很有用),以便其他人可以在它失败时知道你的假设。
  • 正确的“and”必须是“or”。如果可能出现在两个查询结果中的行应该在组合结果中出现两次。如果不是,我不知道它会发生什么,但我认为无论哪种方式它都不会产生任何问题,除非它使解决方案变得不可能。

标签: sql sql-server tsql syntax multi-query


【解决方案1】:

你有两个选择:

  1. 使用CASE expression 按过滤条件排序 - 这适用于表相同且条件简单的情况。
select a.col1, a.col2
from a
where a.col3 = 1 or a.col4 = 0
order by
  case when a.col3 = 1 then 1 else 0 end desc
  , a.col2;

正如 dogyog 所指出的,这个 where 子句应该使用 OR 而不是 AND 来组合两个查询。

  1. 使用UNION ALL
select a.col1, a.col2, 0 QueryNum
from a
where a.col3 = 1

union all

select a.col1, a.col2, 1 QueryNum
from a
where a.col4 = 0

order by QueryNum asc, a.col2;

【讨论】:

  • 选项 1 中的 WHERE 子句不应该使用 OR 而不是 AND
  • @dogyog 好点,我只是复制了 OP 的查询而没有检查它。
  • 是的,我选错了运算符。这个按案例排序很好用,谢谢,我不知道你能做到。
猜你喜欢
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 2023-04-09
  • 2010-09-25
相关资源
最近更新 更多