2014-07-01 61 views
0

我無法過濾查詢的結果。這是我執行查詢:返回了以下結果在連接的查詢中過濾行

SELECT 
ORE.ID AS OR_ID, 
ORE.INIT_VERSION AS OR_INIT_VERSION, 
ORE.INSERT_DATE AS OR_INSERT_DATE, 
ORE.INIT_DATE AS OR_INIT_DATE, 
ORE.END_DATE AS OR_END_DATE, 
ORE.STATE AS OR_STATE, 
ORE.ACTION_NAME AS OR_ACTION_NAME, 
ORH.STATE_ID AS ORH_STATE_ID, 
ORH.INSERT_DATE AS ORH_INSERT_DATE, 
CS.STATE AS CS_STATE 

FROM ORDER_REQUEST ORE 
INNER JOIN ORDER_REQUEST_HISTORY ORH ON ORH.ORDER_REQUEST_ID = ORE.ID AND ORH.COMPONENT_ID = ORE.ARCH_ID 
INNER JOIN COMPONENT_STATE CS ON CS.ID = ORH.STATE_ID 
WHERE ORE.ARCH_ID = 219934 
AND CS.STATE IN ('CREAZIONE', 'ANNULLATO', 'REVISIONE PIANIFICATA', 'APPROVAZIONE PIANIFICATA', 'APPROVAZIONE RIFIUTATA', 'COMPLETATO', 'COMPLETATA') 

OR_ID OR_STATE OR_INIT_DATE OR_ACTION_NAME ORH_STATE_ID OR_END_DATE  CS_STATE ORH_INSERT_DATE  OR_INSERT_DATE   OR_INIT_VERSION 
8821 COMPLETATA 2014-04-07  ATT    111    2014-06-03  COMPLETATA 15-05-2014 12:48:32 07-04-2014 16:49:42  1 
12266 ACQUISITO 2014-06-03  VAR    10018   NULL   CREAZIONE 30-06-2014 18:59:40 03-06-2014 15:53:51  2 
12266 ACQUISITO 2014-06-03  VAR    10018   NULL   CREAZIONE 01-07-2014 12:56:20 03-06-2014 15:53:51  2 

我想以這樣的方式,對於每個OR_ID我只得到與該行進行過濾最大的ORH_INSERT_DATE,即結果的第一行和第三行。 我嘗試了不同的方法,但似乎沒有工作。 特別是我一直在努力,複雜化JOIN:

INNER JOIN ORDER_REQUEST_HISTORY ORH ON ORH.ORDER_REQUEST_ID = ORE.ID AND ORH.COMPONENT_ID = ORE.ARCH_ID AND ORH.INSERT_DATE = (SELECT INSERT_DATE FROM ORDER_REQUEST_HISTORY ORH2 WHERE ORH2.ORDER_REQUEST_ID = ORE.ID) 

但它只返回上述結果的第一行。我也嘗試以相同的方式使WHERE子句複雜化,但它仍然只返回上面結果集的第一行。

有沒有人知道什麼是正確的條款添加?或者我應該通過後續查詢並解決這個問題嗎?

非常感謝提前,

贊布羅塔

回答

1

您可以使用WITH子句和ROW_NUMBER功能做到這一點,像這樣:

WITH CTE AS 
(
SELECT 
ORE.ID AS OR_ID, 
ORE.INIT_VERSION AS OR_INIT_VERSION, 
ORE.INSERT_DATE AS OR_INSERT_DATE, 
ORE.INIT_DATE AS OR_INIT_DATE, 
ORE.END_DATE AS OR_END_DATE, 
ORE.STATE AS OR_STATE, 
ORE.ACTION_NAME AS OR_ACTION_NAME, 
ORH.STATE_ID AS ORH_STATE_ID, 
ORH.INSERT_DATE AS ORH_INSERT_DATE, 
CS.STATE AS CS_STATE, 
ROW_NUMBER() OVER (PARTITION BY ORE.ID ORDER BY ORH.INSERT_DATE DESC) AS RN 
FROM ORDER_REQUEST ORE 
INNER JOIN ORDER_REQUEST_HISTORY ORH ON ORH.ORDER_REQUEST_ID = ORE.ID AND  ORH.COMPONENT_ID = ORE.ARCH_ID 
INNER JOIN COMPONENT_STATE CS ON CS.ID = ORH.STATE_ID 
WHERE ORE.ARCH_ID = 219934 
AND CS.STATE IN ('CREAZIONE', 'ANNULLATO', 'REVISIONE PIANIFICATA', 'APPROVAZIONE PIANIFICATA', 'APPROVAZIONE RIFIUTATA', 'COMPLETATO', 'COMPLETATA') 
) 

SELECT * 
FROM CTE 
WHERE RN = 1 

的想法是分區的基礎上,OR_ID並找到最大值爲ORH_INSERT_DATE的行。您也可以通過用所需列代替*來只選擇特定列。

+0

你是一個富有魅力的人! – Gianluca

+0

其實我相信有一個更好的方法可以在沒有CTE的情況下做到這一點,但我遠離我的開發箱,所以我無法測試和發佈。 –

+1

呃,我實際上已經浪費了一整個上午的時間來讓這個查詢工作嘗試很多事情:複雜的連接,複雜的地方,使用子選項,aso。我有你的答案爲我工作,這很好。再次感謝 – Gianluca