2013-05-07 76 views
1

我對SQL相當陌生,並且對UPDATE查詢有疑問。我正在使用SQL Server 2008 R2。我寫了下面的SELECT查詢:SQL - 僅當具有相同ID的所有記錄符合要求時才修改字段

SELECT res.labresultcat_id, res.patient_id, lab.test_performed, 
     lab.result_status, lab.result_value, lab.abnormal_flag, res.recorded_on, 
     res.cat_test_name, res.results_to, usr.last_name, res.result_viewed 
FROM dbo.med_labresultcat res 
    INNER JOIN dbo.med_labresult lab 
    ON res.labresultcat_id = lab.labresultcat_id 
    LEFT JOIN dbo.res_user usr 
    ON res.results_to = usr.resource_id 
WHERE lab.result_status = 'F' AND usr.last_name = 'Smith' 
    AND res.result_viewed is NULL 

其結果是這個樣子:

patient_id result_id test_performed  abnormal_flag recorded_on results_to  
0001   0045  ABC    N    4/1/2013  14    
0001   0045  CBS    A    4/1/2013  14   
0002   0061  NBC    N    4/3/2013  13    
0002   0061  MST    N    4/3/2013  13 
0003   0090  ABC    H    4/20/2013  10 
0003   0090  MST    N    4/20/2013  10 

我想要做的就是更新results_to場只有當所有與記錄同樣result_id是= N或NULL

所以,我寫了下面的更新查詢:

;WITH lab AS 
    (
    select RES.labresultcat_id, res.cat_test_name, res.results_to, 
      res.result_status, 
      lab.test_performed, lab.result_value, lab.abnormal_flag, 
      res.result_viewed, usr.last_name 
    from DBO.med_labresultcat RES 
    INNER JOIN dbo.med_labresult lab 
     ON res.labresultcat_id = lab.labresultcat_id 
    LEFT JOIN DBO.res_user USR 
     ON res.results_to = usr.resource_id 
    WHERE res.result_viewed is null AND lab.result_status = 'F' 
    and RES.test_date <= '03/15/2013' AND usr.last_name = 'Smith' 
    ) 
    UPDATE lab SET results_to = CASE WHEN 0 = (SELECT COUNT(abnormal_flag) 
    WHERE abnormal_flag = 'A' OR abnormal_flag = 'H' OR abnormal_flag = 'L') 
    THEN '146' ELSE results_to END 

但是,上述查詢引發SQL錯誤「聚合可能不會出現在更新語句的集合列表中」不幸的是,對此錯誤的研究超出了我對SQL的理解。

我真的很感激,如果有人可以提供一些明確的方向,如何繼續前進,因爲我現在很堅持。

+0

演示只是一個未成年人「單挑」的評論......當你'LEFT JOIN'到一個表,然後添加邏輯來限制基於數據集在'WHERE'標準的那個表中的一個字段可以有效地將'LEFT JOIN'變成'INNER JOIN'。 – 2013-05-07 14:49:35

+1

這很有道理。謝謝Alex。 – MLorenzen 2013-05-08 14:46:43

回答

1

嘗試此查詢

;WITH lab AS 
(
    select RES.labresultcat_id, res.cat_test_name, res.results_to, 
     res.result_status, 
     lab.test_performed, lab.result_value, lab.abnormal_flag, 
     res.result_viewed, usr.last_name 
    from DBO.med_labresultcat RES 
    INNER JOIN dbo.med_labresult lab ON res.labresultcat_id = lab.labresultcat_id 
    LEFT JOIN DBO.res_user USR ON res.results_to = usr.resource_id 
    WHERE res.result_viewed is null AND lab.result_status = 'F' 
    and RES.test_date <= '03/15/2013' AND usr.last_name = 'Smith' 
) 
    UPDATE l 
    SET l.results_to = '146' 
    FROM lab l 
    WHERE EXISTS (
       SELECT 1 
       FROM lab l2 
       WHERE l.result_id = l2.result_id     
       HAVING COUNT(DISTINCT ISNULL(l2.abnormal_flag, 'N')) = 1 
       ) AND ISNULL(l.abnormal_flag, 'N') = 'N' 

SQLFiddle

+0

非常感謝您回覆我的問題。我已經使用了上面的查詢,它運行。然而,例如,我有兩個結果具有相同的result_id,一個具有'N'的異常標記,另一個具有'A'的異常標記 - 使用上述查詢,它被重新分配...但由於其中一個結果具有'A'的abnormal_flag不應該被重新分配。 – MLorenzen 2013-05-08 14:52:15

+0

注意SQLFiddle中的result_id = 93的例子中有兩個結果具有相同的result_id,一個具有'N'的abnormal_flag,另一個具有'A'的abnormal_flag - 使用上述查詢,它不會被重新分配。 – 2013-05-08 15:12:54

+0

你是絕對正確的亞歷克斯。實際的列名與我在這裏發佈的內容略有不同,所以一旦我輸入了正確的列名,查詢就可以正常工作。 你真棒。再次感謝! – MLorenzen 2013-05-08 20:37:42

相關問題