Sql 我需要什么样的JOIN语句?
我有两个表PROCESS和STEP以及一些数据,如下所示。(它们具有1-N关系。) 我需要的是一个连接,它将为我提供完成过程的开始和结束时间,如下所示: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_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要求的结束时间字段。