【发布时间】:2009-11-09 09:24:02
【问题描述】:
我正在尝试组合一个查询,该查询将在顶部显示一条特定记录(由记录的主 ID 找到),并在其下方显示所有其他记录,按日期排序(我将“date_added”作为其中之一表中的字段,以及主 ID)。
我可以使用 UNION 来做到这一点(第一个选择会找到我想要的记录,另一个选择会显示所有其他记录),但我想知道是否有更好的方法?
顺便说一句,我正在使用 Oracle。
【问题讨论】:
我正在尝试组合一个查询,该查询将在顶部显示一条特定记录(由记录的主 ID 找到),并在其下方显示所有其他记录,按日期排序(我将“date_added”作为其中之一表中的字段,以及主 ID)。
我可以使用 UNION 来做到这一点(第一个选择会找到我想要的记录,另一个选择会显示所有其他记录),但我想知道是否有更好的方法?
顺便说一句,我正在使用 Oracle。
【问题讨论】:
您可以通过按两个字段排序来做到这一点
第一个表达式是一个表达式,如果该行是您想要的,则返回 0,否则返回 1。排序将升序,以便您首先获得首选记录。
第二个排序字段将添加日期,以便剩余记录按此顺序排序。
恐怕我不知道 sql server 中的 oracle,它会类似于
select *
from the_table
order by (case id when 999 then 0 else 1 end), date_added desc
【讨论】:
ORDER BY <number>在Oracle中有一个特殊的含义,它会在第n列排序。当然,从来没有第 0 列。使用 CASE,它将为每一行添加一个新列并对其进行排序。对于匹配的主键,新列将为 1,其他任何地方为 0。
更简单的方法是按构造进行花哨的排序。以下是 pk = 123 的示例:
select *
from YourTable
order by case when yourpk = 123 then 1 else 2 end, date_added
【讨论】:
您可以使用相同的技术将多个记录排序到顶部
999 第一 998 秒 其次是按日期排序的其他所有内容
选择 *
from the_table
order by (case id when 999 then 0 when 998 then 1 else 2 end), date_added desc
【讨论】:
我不完全了解 Oracle,但您也许可以做类似的事情..
ORDER BY IF(id == THE_ID, 0, 1), date_added
【讨论】:
DECODE(id,THE_ID,0,1) 代替
简单的方法是识别出您想要显示两个独立的内容,因此写入单独的直接查询。一个查询检索第一条记录,第二个查询检索排序列表。由于一个独特的记录,除此之外没有任何真正的性能优势。
【讨论】:
SELECT *
FROM `Table`
ORDER BY (`id` = THE_ID) DESC, `date_added` DESC
【讨论】: