【发布时间】:2012-02-22 22:54:13
【问题描述】:
我很难为这个问题想出一个标题,但我认为对于 SQL 专家来说可能很容易。
表格:
SIMULATION: ID, SIMULATION_SET_ID, EXECUTION_STATUS
SIMULATION_SET: SET_ID
SIMULATION_BATCH: ID
BATCH_ELEMENT: SIMULATION_BATCH_ID, SIMULATION_SET_ID
(换句话说,一个集合包含一堆模拟。一个批次通过中间表包含一堆集合。批次实际上是一个元容器,用于根据何时请求对集合进行分组,并用作容器,但本身不包含状态。)
我正在尝试返回已完成批次的计数,并且已完成批次将是其中所有模拟的执行状态为 COMPLETED 的批次。但是,我似乎得到了任何已完成模拟的批次,即使它们都不是。这是我的尝试:
SELECT COUNT(DISTINCT B.ID)
FROM SIMULATION_BATCH B
INNER JOIN BATCH_ELEMENT BE ON BE.SIMULATION_BATCH_ID=B.ID
INNER JOIN SIMULATION S ON S.SIMULATION_SET_ID=BE.SIMULATION_SET_ID
WHERE S.EXECUTION_STATUS ='COMPLETED'";
所以回头看后,我发现这不起作用。我尝试添加 AND NOT EXISTS(SELECT...) 子句以尝试排除具有执行状态未完成的模拟但根本不起作用的批次,当任何事情发生时它始终返回一个空集正在运行。这是我添加的:
AND NOT EXISTS (SELECT SIM.ID
FROM SIMULATION SIM
INNER JOIN BATCH_ELEMENT BE2 ON BE2.SIMULATION_SET_ID=SIM.SIMULATION_SET_ID
WHERE BE.SIMULATION_BATCH_ID=B.ID AND SIM.EXECUTION_STATUS != 'COMPLETED' );
感谢您对此的任何见解。我认为我需要更好地学习子查询,但我不确定。在我弄清楚如何计数之后,我需要获取包含大量信息的批次列表,但我想如果我能计数的话,我可以做到这一点。
更新:我整天都在努力,除了更多错误之外,没有取得太大进展。我在想一种更简单的方法来描述我正在寻找的内容是我想要批次中的所有模拟都满足某些标准的批次(例如状态是完整的)。当任何(至少 1 个)模拟符合标准时,我可以做到这一点,但似乎是 ALL 让我失望。任何想法将不胜感激。
【问题讨论】:
-
您能发布一些示例数据吗?老实说,您的查询看起来应该可以工作......
-
我会看看我是否可以获得示例数据。 not exists 子句发生的情况是,在模拟运行时我的计数为 0,而当它们全部完成时,我得到一个完整的计数。