2016-06-08 101 views
1

我有以下SQL,這犯規與SQL服務器的工作,因爲爲了通過在子查詢中只允許,當我使用關鍵字,比如頂部。SQL-Server和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 Server上,我認爲它應該工作一樣在Oracle,但我沒有測試是任何方式。

+0

我會盡力而爲,非常感謝 - 我的描述應該會更好下一次 –

+0

我試着用oracle的另一個例子來說明它的工作原理 - 明天我可以在生產系統上測試最終結果,謝謝。 –

+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」字段,我只會得到「當前的」或? –

+0

如果您的意思是您有多個子查詢需要訂購,您可以在* pst_ab *之前添加另一列。 –