【问题标题】:SQL to have one specific record at the top, all others belowSQL 在顶部有一个特定记录,所有其他记录在下面
【发布时间】:2009-11-09 09:24:02
【问题描述】:

我正在尝试组合一个查询,该查询将在顶部显示一条特定记录(由记录的主 ID 找到),并在其下方显示所有其他记录,按日期排序(我将“date_added”作为其中之一表中的字段,以及主 ID)。

我可以使用 UNION 来做到这一点(第一个选择会找到我想要的记录,另一个选择会显示所有其他记录),但我想知道是否有更好的方法?

顺便说一句,我正在使用 Oracle。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您可以通过按两个字段排序来做到这一点

    第一个表达式是一个表达式,如果该行是您想要的,则返回 0,否则返回 1。排序将升序,以便您首先获得首选记录。

    第二个排序字段将添加日期,以便剩余记录按此顺序排序。

    恐怕我不知道 sql server 中的 oracle,它会类似于

    select * 
    from the_table 
    order by (case id when 999 then 0 else 1 end), date_added desc 
    

    【讨论】:

    • 感谢您的回答。顺便说一句,“按 0 排序”是什么意思?我注意到我不能单独使用它,例如仅“按 0 排序”。 (我收到错误:“ORDER BY item must be the number of a SELECT-list expression”)
    • ORDER BY <number>在Oracle中有一个特殊的含义,它会在第n列排序。当然,从来没有第 0 列。使用 CASE,它将为每一行添加一个新列并对其进行排序。对于匹配的主键,新列将为 1,其他任何地方为 0。
    【解决方案2】:

    更简单的方法是按构造进行花哨的排序。以下是 pk = 123 的示例:

    select *
    from YourTable
    order by case when yourpk = 123 then 1 else 2 end, date_added
    

    【讨论】:

    • 这会将特定记录放在最后,应该是“... then 1 else 2 end ...”
    • @ammoQ:谢谢,已编辑答案(reko_t 早些时候发布了相同的想法)
    【解决方案3】:

    您可以使用相同的技术将多个记录排序到顶部

    999 第一 998 秒 其次是按日期排序的其他所有内容

    选择 *

    from the_table 
    order by (case id when 999 then 0 when 998 then 1 else 2 end), date_added desc
    

    【讨论】:

      【解决方案4】:

      我不完全了解 Oracle,但您也许可以做类似的事情..

      ORDER BY IF(id == THE_ID, 0, 1), date_added
      

      【讨论】:

      • Oracle 不支持 IIF,但可以DECODE(id,THE_ID,0,1) 代替
      【解决方案5】:

      简单的方法是识别出您想要显示两个独立的内容,因此写入单独的直接查询。一个查询检索第一条记录,第二个查询检索排序列表。由于一个独特的记录,除此之外没有任何真正的性能优势。

      【讨论】:

      • 是的,但是将其作为单个 SQL 语句执行是有好处的。某些环境(例如报告套件)不允许轻松重用 SQL 构造,因此他可能不得不将大部分 SQL 重复两次,这对维护是有问题的。此外,在 SQL 中执行此操作更简洁:-)。
      【解决方案6】:
      SELECT *
      FROM `Table`
      ORDER BY (`id` = THE_ID) DESC, `date_added` DESC
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多