Sql 我需要什么样的JOIN语句?

Sql 我需要什么样的JOIN语句?,sql,tsql,join,Sql,Tsql,Join,我有两个表PROCESS和STEP以及一些数据,如下所示。(它们具有1-N关系。) 我需要的是一个连接,它将为我提供完成过程的开始和结束时间,如下所示: PROCESS_ID START_TIME END_TIME 1 31/08/2012 10/09/2012 2 31/08/2012 09/09/2012 我需要编写什么样的JOIN语句来完成此任务?为了避免拉入进程ID 3,需要先聚合和筛选 HAVING子句将确保忽略步骤表中PROCESS_ID

我有两个表PROCESS和STEP以及一些数据,如下所示。(它们具有1-N关系。)

我需要的是一个连接,它将为我提供完成过程的开始和结束时间,如下所示:

PROCESS_ID START_TIME END_TIME  
1          31/08/2012 10/09/2012  
2          31/08/2012 09/09/2012

我需要编写什么样的JOIN语句来完成此任务?

为了避免拉入进程ID 3,需要先聚合和筛选

HAVING子句将确保忽略
步骤
表中PROCESS_ID 3的所有行。一个简单的
,其中结束时间不为空“已完成”
无法完成。在加入后也不会进行聚合

SELECT
   P.PROCESS_ID,
   S.StartTime, S.EndTime
FROM
   PROCESS P
   JOIN
   (
   SELECT
      PROCESS_ID,
      MIN(START_TIME) AS StartTime,
      MAX(END_TIME) AS EndTime
   FROM
      STEP
   GROUP BY
      PROCESS_ID
   HAVING
      COUNT(*) = COUNT(END_TIME) -- only where we have no END_TIME nulls
   ) S ON P.PROCESS_ID = S.PROCESS_ID

例如,还有其他选项使用NOT EXISTS来忽略活动行,但我在这里使用的是just END_TIME和NULLs来忽略步骤行

为了避免拉入进程ID 3,需要先进行聚合和筛选

HAVING子句将确保忽略
步骤
表中PROCESS_ID 3的所有行。一个简单的
,其中结束时间不为空“已完成”
无法完成。在加入后也不会进行聚合

SELECT
   P.PROCESS_ID,
   S.StartTime, S.EndTime
FROM
   PROCESS P
   JOIN
   (
   SELECT
      PROCESS_ID,
      MIN(START_TIME) AS StartTime,
      MAX(END_TIME) AS EndTime
   FROM
      STEP
   GROUP BY
      PROCESS_ID
   HAVING
      COUNT(*) = COUNT(END_TIME) -- only where we have no END_TIME nulls
   ) S ON P.PROCESS_ID = S.PROCESS_ID

例如,还有其他选项使用NOT EXISTS来忽略活动行,但我在这里使用的是END_TIME和NULL来忽略步骤行

看起来您需要一个
内部联接
并使用
MIN
MAX
函数

SELECT PROCESS.PROCESS_ID, MIN(START_TIME), MAX(END_TIME)
FROM PROCESS
INNER JOIN STEP ON STEP.PROCESS_ID = PROCESS.PROCESS_ID
GROUP BY PROCESS.PROCESS_ID

看起来您需要一个
内部联接
,并使用
MIN
MAX
函数

SELECT PROCESS.PROCESS_ID, MIN(START_TIME), MAX(END_TIME)
FROM PROCESS
INNER JOIN STEP ON STEP.PROCESS_ID = PROCESS.PROCESS_ID
GROUP BY PROCESS.PROCESS_ID

为什么要加入步骤表?@Johanh-因为步骤有一个过程ID字段,该字段在两个表之间通用,并且包含OP要求的结束时间字段。为什么要加入步骤表?@Johanh-因为步骤有一个过程ID字段,该字段在两个表之间通用,并且包含OP要求的结束时间字段。