1

我有以下 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 编号。

非常感谢。

4

3 回答 3

1

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

现在,我了解您的困境是这样的:一方面,您想要不包括该pst_ab列的不同值,但另一方面,您希望这些值按同一列排序。

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

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 server 上测试过,我认为它在 oracle 上应该可以工作,但我没有任何测试方法。

于 2016-06-08T09:50:44.263 回答
0

尝试切换您的不同和顺序;

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

这样,您仍然可以获得不同的列表并且它的排序正确。当然,您必须在内部选择中包含字段 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
于 2016-06-08T09:23:01.997 回答
0

您需要将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
于 2016-06-08T09:23:25.790 回答