2016-09-14 131 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