1

我对 SQL 相当陌生,并且对 UPDATE 查询有疑问。我正在使用 SQL Server 2008 R2。我编写了以下 SELECT 查询:

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

我要做的是仅当具有相同 result_id 的所有记录 = N 或 NULL 时才更新 results_to 字段

因此,我编写了以下 UPDATE 查询:

;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 的理解。

如果有人能提供一些明确的方向来说明如何继续前进,我将不胜感激,因为我现在非常困惑。

4

1 回答 1

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上的演示

于 2013-05-07T15:01:30.747 回答