在SQL中按不在选择语句中的字段排序。

6

我需要创建一个查询,仅获取customer_no列(因为软件限制如此,我无法在外部编写代码)。但是我需要能够按照create_dt(反向)列对数据进行排序。代码/SQL限制我使用以下内容,因为要按照某些数据排序必须出现在选择语句中。

我不能让它出现在那里-有没有任何方法解决这个问题?

 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吗? - Barmar
这是Transact SQL。我相信。我正在通过软件进行前端开发。话虽如此,前3500个工作正常,但排序无法正常工作。 - YelizavetaYR
你的 WHERE 子句毫无用处,为什么还要加上呢? - John Ruddell
1
你是否意识到在每个查询中都使用NOLOCK的后果?这样做会导致缺失和/或重复行。http://www.jasonstrate.com/2012/06/the-side-effect-of-nolock/ - Sean Lange
@JohnRuddell 系统会自动生成语法 - 但当我们需要过滤/修改它时 - 这经常发生 - 我们会在代码模式下打开它并进行更改。但我们尽量不要做太多的更改,因为我们并不总是有测试它的能力。 - YelizavetaYR
3个回答

9
当然可以。你的查询看起来像是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后,我得到了以下错误:如果指定了Select Distinct,则Order By项必须出现在选择列表中(-1),我似乎无法摆脱它。 - YelizavetaYR
@YelizavetaYR . . . 最简单的解决方案是使用 group by 而不是 distinct。我修改了第一个查询。 - Gordon Linoff

1
这看起来不像是mysql。无论如何,您可以尝试有序子查询,即:
From (select * from T_CUSTOMER order by create_dt) a WITH (NOLOCK)

我希望这能帮到你。


1
使用包含您要排序的列的子查询。然后主查询只需返回您关心的列即可:
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
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接