2016-06-08 4 views
1

У меня есть следующий sql-код, который не работает с sql-сервером, потому что order by разрешен только в подзапросе, когда я использую такие ключевые слова, как top.sql-server and oracle - заказывайте в подзапросе

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-числа только один раз.

Большое спасибо.

ответ

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, я думаю, что он должен работать на оракуле, но у меня нет никакого способа его проверить.

+0

Я попробую это, спасибо большое - мое описание должно быть лучше в следующий раз –

+0

ive попробовал это на оракуле с другим примером, он там тоже работает - завтра я смогу проверить окончательный результат на производительной системе, спасибо. –

+0

Рад помочь :-) –

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 
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 
+0

Таким образом, я получаю все возможные комбинации из всех полей, упорядоченных по pst_ab. Это не то, что я хочу. Не выбирая поле «pst_ab» в подзапросе i, вы получите только «текущий» или? –

+0

Вы можете добавить еще один столбец перед * pst_ab *, если вы имеете в виду, что у вас есть более одного подзапроса для заказа. –