按不在 SQL 中的 select 语句中的字段排序

Posted

技术标签:

【中文标题】按不在 SQL 中的 select 语句中的字段排序【英文标题】:Ordering by a field not in the select statement in SQL 【发布时间】:2014-11-05 12:51:33 【问题描述】:

我需要创建一个只提取 customer_no 列的查询(因为软件限制就是这样,我无法在外部对其进行编码)。但我需要能够按 create_dt (反向)列对数据进行排序。代码/SQL 限制了我使用以下内容,因为为了按某些内容进行排序,数据必须出现在 select 语句中。

我不能让它出现在那里——有什么办法解决这个问题吗?

 Select Distinct top 3500 a.customer_no 
  From T_CUSTOMER a  WITH (NOLOCK)
  JOIN (Select a1.customer_no From VXS_CUST_TKW a1 WITH (NOLOCK) Where a1.tkw in (141)) as e ON      e.customer_no = a.customer_no
  Where 1 = 1
 order by a.create_dt desc

【问题讨论】:

我从来没有遇到过 mysql 的问题。另一方面,MySQL 没有TOP 3500,您必须在查询末尾使用LIMIT 3500。你确定你使用的是 MySQL 吗? 它的事务 SQL。我相信。我正在通过软件工作 - 在前端。也就是说,前 3500 名的作品没有问题 - 但排序不起作用。 You're WHERE 子句没有用,为什么会有呢? 您是否知道在每次查询中抛出 NOLOCK 的后果?您可以并且将会丢失和/或重复行。 jasonstrate.com/2012/06/the-side-effect-of-nolock @JohnRuddell 系统自己创建语法 - 但是当我们需要过滤/修改它时 - 这通常是 - 我们在代码模式下打开它并进行更改。但我们尽量不做太多更改,因为我们并不总是有能力对其进行测试。 【参考方案1】:

当然可以。您的查询看起来像 SQL Server,这可能会执行您想要的操作:

  Select top 3500 a.customer_no 
  From T_CUSTOMER a  WITH (NOLOCK) JOIN
       (Select a1.customer_no
        From VXS_CUST_TKW a1 WITH (NOLOCK)
        Where a1.tkw in (141)
       ) e
       ON e.customer_no = a.customer_no
  Where 1 = 1
  group by a.customer_no
  order by max(a.create_dt) desc;

MySQL 中的等效查询如下所示:

  Select a.customer_no 
  From T_CUSTOMER a JOIN
       (Select a1.customer_no
        From VXS_CUST_TKW a1 
        Where a1.tkw in (141)
       ) e
       ON e.customer_no = a.customer_no
  Where 1 = 1
  order by a.create_dt desc
  limit 3500;

我删除了distinct,因为它可能没有必要。如果是,请重新添加。

【讨论】:

我使用您的查询 - 第一个查询,它似乎工作,但只要我在单词 select 之后添加 Distinct,我就会收到以下错误:Order By items must appear in the select list if select distinct被指定(-1),我似乎无法摆脱它。 @YelizavetaYR 。 . .最简单的解决方案是使用group by 而不是distinct。我修改了第一个查询。【参考方案2】:

这看起来不像mysql。

无论如何...你可以尝试一个有序的子选择 IE

From (select * from T_CUSTOMER order by create_dt) a WITH (NOLOCK)

我希望这会有所帮助。

【讨论】:

【参考方案3】:

使用包含您排序依据的列的子查询。那么主查询就可以只返回你关心的列了:

SELECT customer_no
FROM (
    Select top 3500 a.customer_no, a.create_dt
      From T_CUSTOMER a  WITH (NOLOCK) JOIN
           (Select a1.customer_no
            From VXS_CUST_TKW a1 WITH (NOLOCK)
            Where a1.tkw in (141)
           ) e
           ON e.customer_no = a.customer_no
      Where 1 = 1
      order by a.create_dt desc
)

【讨论】:

以上是关于按不在 SQL 中的 select 语句中的字段排序的主要内容,如果未能解决你的问题,请参考以下文章

如题:如何用一条SQL语句按输入的参数进行判断执行查询数据

sql按某个字段值顺序排序

若SQL语句中的ORDER BY短语中指定了多个字段,则( )。

SQL 中的LIMIT语句查询工资排前3和第6的员工信息。

sql语句中的group by啥意思

sql server 2000返回在第一个表中但不在第二个表中的数据