IN子句不在子查询内连接中工作

时间:2016-02-17 13:08:42

标签: sql-server tsql

我想在2015年提取最新实验室值的列表。所有实验室值都存储在一个表中,我需要将数据限制在2015年以内并将其限制为某些类型的实验室,因此最大日期不会给我最新的实验室,无论其类型如何。虽然我使用IN子句,但包括其他类型的实验。

我需要最后一个值,无论它们具有什么类型的实验室,只要它在IN子句中标识的类型内(即我不需要每种类型的最后一个值)

select distinct 
    t2.pat_id
    ,t2.pat_last_name "PatientLast"
    ,t2.pat_first_name "PatFirst"
    ,t2.birth_date
    ,t1.contact_date "ContactDate"
    ,t3.name "EncounterType"
    ,t4.ord_num_value "Numeric Value"
    ,t4.result_date
 from table1 t1
 inner join table2 t2 on t1.pat_id = t2.pat_id
 inner join table3  t3 on t1.enc_type_c = t3.disp_enc_type_c
 inner join table4 t4 on t1.pat_enc_csn_id = t4.pat_enc_csn_id
 inner join 
 (
    select 
        table1.pat_id
        ,max(table1.contact_date) as LastResult
        ,table4.component_id
    from table1 
    **inner join order_results on table1.pat_enc_csn_id = table4.pat_enc_csn_id
    where table4.component_id in ('1526664','1558024','1004','2667', '1230000002','1564041') 
        and table1.contact_date between '2015-01-01' and '2015-12-31'
    group by table1.pat_id, table4.component_id
 ) enc2** on table1.pat_id = enc2.pat_id 
    and table1.contact_date = enc2.LastResult 
order by table2.pat_last_name, table2.pat_first_name

1 个答案:

答案 0 :(得分:0)

您的查询有点难以理解。但一种方法是使用row_number()。像这样:

select t.*
from (select . . .,
             row_number() over (partition by pat_id order by contact_date desc) as seqnum
      from . . .
      where . . .
     ) t
where seqnum = 1;

子查询中有where条件不在外部查询中,因此很难遵循预期的逻辑。使用row_number()比子查询简单得多,因为您不必重复任何逻辑。