SQL查询连接2个表并获得特定结果

时间:2015-11-20 18:33:51

标签: sql-server

我有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 

2 个答案:

答案 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是一个不等运算符。但它会根据您的标准为您提供记录。

相关问题