2016-09-14 244 views
1

我需要一個查詢的幫助,我似乎無法弄清楚如何編寫。 (SQL Server)的需要有關SQL查詢的幫助

我有兩個表, 「項目」 和 「ProjectStatus」 有這些領域:(我省略了不相關的列)

項目

PROJID (PK) NAME 

ProjectStatus

STATUSID PROJID (FK, references projid in project table) CHANGEDDATE 

我想要得到的是有3或5 statusid所有項目的列表,所以我明顯的首次嘗試是做到以下幾點:

SELECT p.PROJID, p.NAME 
FROM Project AS p 
INNER JOIN ProjectStatus AS s 
ON s.PROJID=p.PROJID 
WHERE s.STATUSID IN (3, 5) 

(忽略此查詢任何潛在的語法錯誤,我只是從內存中寫下來 - 它在我測試時工作)

現在,事實證明,每當有人更改項目的項目狀態時,新條目就會進入ProjectStatus表。它不會像我最初想象的那樣更新STATUSID值。

這意味着,我必須

  1. 從ProjectStatus表
  2. 執行與上述相同的查詢,獲取最新的狀態,除了STATUSID必須是最新的,不是任何隨機STATUSID連接到該項目

的SQL來獲得項目的當前狀態是:

SELECT TOP 1 STATUSID 
FROM ProjectStatus 
WHERE PROJID=(any given project id) 
ORDER BY CHANGEDDATE DESC 

百萬美元問題

如何將此查詢合併到第一個以獲得所需的結果? (或者會得到我我想要的任何其他查詢)

回答

2

它看起來像你需要cross apply在這裏。注意它從2005年版本開始在SQL Server中可用。

SELECT p.PROJID, p.NAME, S.STATUSID 
FROM Project AS p 
    CROSS APPLY (
     SELECT TOP 1 STATUSID 
     FROM ProjectStatus as S 
     WHERE S.PROJID=p.PROJID 
     ORDER BY CHANGEDDATE DESC 
    ) as S 
WHERE s.STATUSID IN (3, 5) 
+0

由於'WHERE'子句,'CROSS APPLY'更合適。 –

+0

@GordonLinoff合理的說明,謝謝。最初錯過了這個,更新了答案。 –

+0

完美,這正是我需要的!謝謝 :) – msk

0

試試這個

SELECT p.PROJID, p.NAME 
FROM Project AS p 
INNER JOIN ProjectStatus AS s 
ON s.PROJID=p.PROJID 
WHERE s.STATUSID >= 3 && s.STATUSID <= 5