sql-server 和 oracle - subselect 中的排序依据

sql-server and oracle - order by in subselect

我有以下 sql,它不适用于 sql-server,因为当我使用像 top.

这样的关键字时,只允许在子选择中使用 order by
SELECT DISTINCT *
  FROM ( SELECT pnr, naname, vorname, gebdat, '' p_alter, geschl, gebort
       FROM pgrdat
      WHERE man = 'XYZ'
      ORDER BY pst_ab DESC )

有什么方法可以得到我想要的结果吗? sql 也应该在 oracle 下工作。

我想在没有 "pst_ab" 的情况下区分所有字段,但同时我想按 "pst_ab" 排序。

解决方法是我使用子选择之外的顺序,源代码确保我只获得所有 pnr-numbers 一次。

非常感谢。

尝试切换您的不同并按以下顺序排序;

SELECT *
FROM (
    SELECT DISTINCT
        pnr
        ,naname
        ,vorname
        ,gebdat
        ,'' p_alter
        ,geschl
        ,gebort
        ,pst_ab
    FROM pgrdat
    WHERE man = 'XYZ'
    )
ORDER BY pst_ab DESC

这样您仍然可以获得不同的列表并且它的顺序是正确的。当然,您必须在内部 select 中包含字段 pst_ab。如果您不想在结果中出现此内容,请尝试此操作;

SELECT DISTINCT
pnr
,naname
,vorname
,gebdat
,p_alter
,geschl
,gebort
FROM (
    SELECT DISTINCT
        pnr
        ,naname
        ,vorname
        ,gebdat
        ,'' p_alter
        ,geschl
        ,gebort
        ,pst_ab
    FROM pgrdat
    WHERE man = 'XYZ'
    )
ORDER BY pst_ab DESC

您需要从子选择中提取 ORDER BY

SELECT DISTINCT *
  FROM (SELECT pnr, naname, vorname, gebdat, '' p_alter, geschl, gebort, pst_ab
       FROM pgrdat
      WHERE man = 'XYZ')
ORDER BY pst_ab DESC

关系数据库中的表本质上是未排序的,因此 from 子句中使用的所有内容都被视为未排序。
这就是 SQL 服务器不允许您在派生 table 中使用 order by 子句的原因,除非您还使用了 top 关键字。

现在,我知道你的困境是这样的:一方面,你想要不包含 pst_ab 列的不同值,但另一方面,你希望值按 pst_ab 列排序同一列。

幸运的是,您可以为此使用 ROW_NUMBER() window 函数:

SELECT  pnr, 
        naname, 
        vorname, 
        gebdat, 
        p_alter, 
        geschl, 
        gebort
FROM (
    SELECT  pnr, 
            naname, 
            vorname, 
            gebdat, 
            '' p_alter, 
            geschl, 
            gebort, 
            ROW_NUMBER() OVER(PARTITION BY  pnr, 
                                            naname, 
                                            vorname, 
                                            gebdat, 
                                            geschl, 
                                            gebort 
                                ORDER BY pst_ab DESC) RowNumber
    FROM pgrdat
    WHERE man = 'XYZ'
) d
WHERE RowNumber = 1

ROW_NUMBER 将按 pst_ab 对结果进行排序,外部查询中的 WHERE 子句将提供 DISTINCT 功能。

在 Sql 服务器上测试过,我认为它在 oracle 上应该也能正常工作,但我没有任何测试方法。