Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将状态检查添加到多表查询_Sql_Sql Server 2008 - Fatal编程技术网

Sql 将状态检查添加到多表查询

Sql 将状态检查添加到多表查询,sql,sql-server-2008,Sql,Sql Server 2008,我有一个查询,可以从受影响的表和支持表中查找应用程序。第三个表包含我需要查询的更多项目信息。其中之一是状态字段。我想向该项目表添加一个联接,并且仅当状态显示为“正在进行”时才返回结果。这就是我到目前为止所做的: 数据和列的示例 申请资料如下 Appid ProjectId 197 251 项目信息列如下 projectd项目名称实施日期状态 select AppId = a.AppId, ApplicationName =

我有一个查询,可以从受影响的表和支持表中查找应用程序。第三个表包含我需要查询的更多项目信息。其中之一是状态字段。我想向该项目表添加一个联接,并且仅当状态显示为“正在进行”时才返回结果。这就是我到目前为止所做的:

数据和列的示例

申请资料如下

Appid ProjectId
 197   251
项目信息列如下

projectd项目名称实施日期状态

   select AppId                   = a.AppId,
   ApplicationName         = a.ApplicationName 

 from      Applications           a
 left join ( select AppId = t.AppId ,
               Cnt   = count(*)
        from ImpactedApplications t
        group by t.AppId
      ) ia on ia.AppId = a.AppId
 left join ( select AppId = t.AppId ,
               Cnt   = count(*)
        from SupportingApplications t
        group by t.AppId
      ) sa on sa.AppId = a.AppId
      where sa.Cnt > 0 OR ia.Cnt > 0 ORDER BY ApplicationName ASC
CTE方法

);使用CTE(appid、ApplicationName、ProjectId) 作为 (

工会可能在这里工作

SELECT ApplicationName , P.*
FROM Applications A
INNER JOIN ImpactedApplications IA
on A.AppId = IA.AppId
INNER JOIN Project P
on IA.ProjectId = P.ProjectID
AND P.Status ='InProgress'
UNION
SELECT ApplicationName , P.*
FROM Applications A
INNER JOIN SupportingApplications SA
on A.AppId = SA.AppId
INNER JOIN Project P
on IA.ProjectId = P.ProjectID
AND P.Status ='InProgress'
order by ApplicationName ASC

若我并没有看错您现有的代码,那个么您需要基于这两个表上的projectd将project表和applications表连接起来,并且只需要获取status=InProgress的记录

select AppId                   = a.AppId,
   ApplicationName         = a.ApplicationName, 
   p.*
 from      Applications           a
 left join ( select AppId = t.AppId ,
               Cnt   = count(*)
        from ImpactedApplications t
        group by t.AppId
      ) ia on ia.AppId = a.AppId
 left join ( select AppId = t.AppId ,
               Cnt   = count(*)
        from SupportingApplications t
        group by t.AppId
      ) sa on sa.AppId = a.AppId
 join project p on a.projectid=p.projectid
      where (sa.Cnt > 0 OR ia.Cnt > 0 )
            and p.status='InProgress'
ORDER BY ApplicationName ASC

您能否提供应用程序、受影响应用程序和支持应用程序的示例数据table@Rajesh在我的原始帖子中添加了带有示例的信息。希望这有帮助!根据专栏更新了我的答案,你能检查一下这是否适用于you@Rajesh当我使用它时,我得到的错误是:Msg 207,级别16,状态1,第7行无效列名“ProjectId”。Msg 8158,级别16,状态1,第1行“CTE”的列数超过了列列表中指定的列数。更新了CTE输出,现在可以尝试吗?您可以演示一下吗?这些表是受影响的应用程序,支持应用程序和Projects@OnceorTwice,根据您的代码,您甚至有一个应用程序表,对吗?以及应用程序和项目t两个项目都有我加入的项目,并将条件status='InProgress'
select AppId                   = a.AppId,
   ApplicationName         = a.ApplicationName, 
   p.*
 from      Applications           a
 left join ( select AppId = t.AppId ,
               Cnt   = count(*)
        from ImpactedApplications t
        group by t.AppId
      ) ia on ia.AppId = a.AppId
 left join ( select AppId = t.AppId ,
               Cnt   = count(*)
        from SupportingApplications t
        group by t.AppId
      ) sa on sa.AppId = a.AppId
 join project p on a.projectid=p.projectid
      where (sa.Cnt > 0 OR ia.Cnt > 0 )
            and p.status='InProgress'
ORDER BY ApplicationName ASC