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 上应该也能正常工作,但我没有任何测试方法。
我有以下 sql,它不适用于 sql-server,因为当我使用像 top.
这样的关键字时,只允许在子选择中使用 order bySELECT 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 上应该也能正常工作,但我没有任何测试方法。