2015-11-20 68 views
0

我有2個表,我需要做一個聯接,批處理和示例。我必須選擇FinishedTS字段中沒有數據的所有批次,條件是該批次的所有樣品(來自樣品表)都處於狀態字段,其值爲「已確認」。這裏是我擁有的表格。使用示例表我想要一個將返回kpID 2004的查詢,它是唯一符合條件的批次kpID。我將不勝感激任何幫助提出一個查詢,可以實現這一點。SQL查詢加入2個表並獲得特定結果

表 - 批量

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

這種方法會BAD kfBatchID值的列表,並選擇只批記錄是不壞的名單上,但也在好的名單上。 Common-table-expression將查找錯誤的值(任何狀態不是「已確認」的)。左連接排除這些記錄。加入回採樣確保了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是一個不等式運算符。但它會根據您的標準爲您提供記錄。

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') 

然而,下面將gaurantee有在樣品ATLEAST一個紀錄確認狀態

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') 
+0

您的解決方案具有更好的IO統計數據比我的。 –