需要SQL查询的帮助

时间:2016-09-14 11:38:25

标签: sql sql-server database

我需要一个查询的帮助,我似乎无法弄清楚如何撰写。 (SQL Server)

我有两个表,“Project”和“ProjectStatus”,它们包含以下字段:(我省略了不相关的列)

项目

PROJID (PK)    NAME

ProjectStatus

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

我想获得一个状态为3或5的所有项目的列表,所以我明显的第一次尝试是执行以下操作:

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
  3. 获取项目当前状态的SQL是:

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

    百万美元问题

    如何将此查询合并到第一个查询中以获得所需结果? (或任何其他可以让我得到我想要的查询)

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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