仅对子选择

时间:2018-10-22 11:58:24

标签: sql sql-server tsql join

我有两个表:

  • 第一个是DIAGNOZY,其中包含以下列:yearIDgendrebirthdayICZ,其ID为医疗保健提供者diagnosis_codedate。每行都是医生为病人记录的。来自相同/不同医生(ICZ)且诊断相同/不同的每个ID都有多个记录。

  • 第二张表PACIENT_SEKVENCE_DETAIL是用于ID的具有特殊药物的表,他们之前使用过的药物种类数量,第一次开药日期(date_first )和特殊药物(date_special)的开药日期。

我只想选择在DIAGNOZY的同一天或更晚于date_special的诊断日期的患者,并且整个患者只接受这一诊断时间(无多重诊断)。

我最后想要的表将包含两列:PACIENT_SEKVENCE_DETAILID(诊断),并且会有满足指定条件的不同患者-因此每个患者都会在其中只是一次,因为他不会做出一个以上的诊断。

我的代码如下:

DG

但是,它返回所有患者所有诊断信息,并且完全忽略内部选择中的情况。

我对SQL非常陌生,我自己使用Internet进行学习,所以请原谅我的愚蠢。

诊断表:

select t1.ID, diagnosis_code as DG
from (
    select d.ID as ID, count(distinct diagnosis_code) as count_dg
    from DIAGNOZY d join PACIENT_SEKVENCE_DETAIL s on d.ID=s.ID
    where d.date>=s.date_special
    group by d.ID
    having count(distinct diagnosis_code)=1) t1
join DIAGNOZY f on t1.ID=f.ID
group by t1.ID, f.diagnosis_code 

PACIET_SEKVENCE_DETAIL

year ID gendre  birth_date ICZ  diagnosis_code date
2012    35902587895 M   2000    94618000    L400    2012-06-11  
2013    35902587895 M   2000    94619000    L400    2013-02-04  
2012    35902587895 M   2000    94618000    L400    2012-07-11  
2013    35902587895 M   2000    94618000    L400    2013-05-10  
2011    35902591668 M   2000    08009000    L400    2011-09-27  
2015    35902596431 M   2000    89177000    M0800   2015-08-26  
2010    35902612150 M   2000    10194000    M459    2010-01-07  

因此,在最终表中,只有在表DIAGNOZY中只有一个不同诊断并且在另一个表中(其中nr_types_befor为0)的人才能获得ID和诊断代码。

2 个答案:

答案 0 :(得分:0)

您的查询全部合并在一起,而示例数据未汇总在一起,您引用的是d.start_data yest,只有别名为s的表保存了where子句中的所有列。

答案 1 :(得分:0)

您可以尝试一下。

SELECT DISTINCT
    d.ID, 
    d.diagnosis_code DG     
FROM DIAGNOZY d
WHERE EXISTS (
    SELECT d1.ID FROM 
        DIAGNOZY d1
        INNER JOIN PACIENT_SEKVENCE_DETAIL s ON d1.ID = s.ID 
                        AND s.nr_types_before = 0
    WHERE 
        d1.ID = d.ID
        AND d1.date >= s.date_special
    GROUP BY d1.ID
    HAVING COUNT(DISTINCT d1.diagnosis_code) = 1 )