我有2个表,我需要进行连接,Batch和Sample。我必须在FinishedTS字段中选择所有没有数据的批次,条件是该批次的所有样本(来自Sample表格)都在状态字段中,其值为'Acknowledeged'。这是我的表格。使用示例表我想要一个返回kpID 2004的查询,它是唯一符合条件的Batch kpID。如果想出一个可以实现此目的的查询,我将不胜感激。
表 - 批处理
kpID BatchNumFull ACC_Number FinishedTS
1186 15-322.2001-242 322.2001 2015-10-07 17:18:00
2012 15-322.2001-246 322.2001 2015-10-13 15:58:00
2000 15-999-001 999
2004 15-999-002 999
2038 15-999-004 999
表格 - 样本
kfBatchID Status SampleID
2038 Acknowledged 0001
2038 0002
2038 Delivered 0003
2004 Acknowledged 0077
2004 Acknowledged 0078
2004 Acknowledged 0034
答案 0 :(得分:1)
以下sql将为您提供所需的输出,但不保证Sample with Acknowledged状态的记录。
SELECT * FROM Batch
WHERE FinishedTS IS NULL
AND NOT EXISTS (SELECT 1 FROM Sample
WHERE Batch.kpId = Sample.kfBatchId
AND [status] <> 'Acknowledged')
但是,以下内容将保证在具有已确认状态的样本中至少有一条记录
SELECT * FROM Batch
WHERE FinishedTS IS NULL
AND EXISTS (SELECT 1 FROM Sample
WHERE Batch.kpId = Sample.kfBatchId
AND [status] = 'Acknowledged')
AND NOT EXISTS (SELECT 1 FROM Sample
WHERE Batch.kpId = Sample.kfBatchId
AND [status] <> 'Acknowledged')
答案 1 :(得分:0)
此方法创建一个BAD kfBatchID值列表,并仅选择不在错误列表中的批记录,但也在良好列表中。 Common-table-expression将找到错误的值(状态不是“已确认”的任何东西)。左连接排除了这些记录。加入Sample确保id实际上有一个样本(如果不这样做,则包括记录2000):
所以看起来有点像这样:
;with ExcludeBatchId
as (
select distinct
kfBatchID
from [Sample]
where [status] <> 'Acknowledged'
)
select distinct
[Batch].*
from [Batch]
join [Sample]
on [Sample].[kfBatchID] = [Batch].[kpID]
left join ExcludeBatchId
on ExcludeBatchId.[kfBatchID] = [Batch].[kpID]
where [Batch].FinishedTS is null
and ExcludeBatchId.[kfBatchID] is null
现在我的表现并不那么好,因为它有两个distinct
,而CTE中的where
是一个不等运算符。但它会根据您的标准为您提供记录。