需要SQL查询方面的帮助吗

需要SQL查询方面的帮助吗,sql,sql-server,database,Sql,Sql Server,Database,我需要一个我似乎不知道如何编写的查询的帮助。(SQL Server) 我有两个表,“Project”和“ProjectStatus”有这些字段:(我省略了不相关的列) 项目 PROJID (PK) NAME 项目状态 STATUSID PROJID (FK, references projid in project table) CHANGEDDATE 我想获得statusid为3或5的所有项目的列表,因此我显然第一次尝试是执行以下操作: SELECT p.PROJID,

我需要一个我似乎不知道如何编写的查询的帮助。(SQL Server)

我有两个表,“Project”和“ProjectStatus”有这些字段:(我省略了不相关的列)

项目

PROJID (PK)    NAME
项目状态

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

我想获得statusid为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值

那意味着我必须

  • 从ProjectStatus表中获取最新状态
  • 执行与上述相同的查询,但STATUSID必须是最新的,而不仅仅是连接到项目的任何随机STATUSID
  • 获取项目当前状态的SQL是:

    SELECT TOP 1 STATUSID 
    FROM ProjectStatus 
    WHERE PROJID=(any given project id)
    ORDER BY CHANGEDDATE DESC
    
    百万美元问题

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

    试试这个

    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
    
    选择p.PROJID,p.NAME
    从项目作为p
    内部联接项目状态为s
    关于s.PROJID=p.PROJID
    
    其中s.STATUSID>=3&&s.STATUSID看起来您需要在此处交叉应用。请注意,从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)
    

    由于
    WHERE
    子句的存在,
    交叉应用
    更为合适。@GordonLinoff请注意,谢谢。最初错过了这个,更新了答案。太好了,这正是我需要的!谢谢:)