SQL性能从同一个表中多次排除

SQL性能从同一个表中多次排除,sql,performance,Sql,Performance,我有一张桌子,上面有一张名单,假设我有100个人在那张桌子上 我需要筛选出使用不同标准的人员并将他们分组,问题是当我在第4-5级开始排除时,性能问题出现了,并且变得缓慢 with lst_tous_movements as ( select t1.refid_eClinibase t1.[dthrfinmouvement] t1.[unite_service_id] t1.[unite_service_suiv_id]

我有一张桌子,上面有一张名单,假设我有100个人在那张桌子上

我需要筛选出使用不同标准的人员并将他们分组,问题是当我在第4-5级开始排除时,性能问题出现了,并且变得缓慢

with lst_tous_movements as (
    select
        t1.refid_eClinibase
        t1.[dthrfinmouvement]
        t1.[unite_service_id]
        t1.[unite_service_suiv_id]
    from sometable t1
)

,lst_patients_hospitalisés as (
    select distinct
        t1.refid_eClinibase
    from lst_tous_movements t1
    where
    t1.[dthrfinmouvement] = '4000-01-01'
)
,lst_patients_admisUIB_transferes as (
    select distinct
        t1.refid_eClinibase
    from lst_tous_movements t1
    left join lst_patients_hospitalisés t2 on t1.refid_eClinibase = t2.refid_eClinibase
    where
    t1.[unite_service_id] = 4
    and t1.[unite_service_suiv_id] <> 0 
    and t2.refid_eClinibase is null
)
,lst_patients_admisUIB_nonTransferes as (
    select distinct
        t1.refid_eClinibase
    from lst_tous_movements t1
    left join lst_patients_admisUIB_transferes t2 on t1.refid_eClinibase = t2.refid_eClinibase
    left join lst_patients_hospitalisés t3 on t1.refid_eClinibase = t3.refid_eClinibase
    where

    t1.[unite_service_id] = 4
    and t1.[unite_service_suiv_id] = 0  
    and t2.refid_eClinibase is null
    and t3.refid_eClinibase is null
)
,lst_patients_autres as (
    select distinct
        t1.refid_eClinibase
    from lst_patients t1
    left join lst_patients_admisUIB_transferes t2 on t1.refid_eClinibase = t2.refid_eClinibase 
    left join lst_patients_hospitalisés t3 on t1.refid_eClinibase = t3.refid_eClinibase
    left join lst_patients_admisUIB_nonTransferes t4 on t1.refid_eClinibase = t4.refid_eClinibase
    where
    t2.refid_eClinibase is null
    and t3.refid_eClinibase is null
    and t4.refid_eClinibase is null
)

谢谢。

很难准确理解问题中的所有规则,但一般的方法应该是在单个查询中添加一个“分组”列,使用
CASE
语句对人员进行分类

案例中的条件按顺序求值,因此如果满足第一个条件,则后续条件甚至不会针对该行求值

这里有一些代码让你开始

select  t1.refid_eClinibase
        ,t1.[dthrfinmouvement]
        ,t1.[unite_service_id]
        ,t1.[unite_service_suiv_id]
        CASE    WHEN [dthrfinmouvement] = '4000-01-01' THEN 'Group1 Label'
                WHEN condition2 = something THEN 'Group2 Label'
                ....
                WHEN conditionN = something THEN 'GroupN Label'
                ELSE 'Catch All Label'
        END as person_category
from sometable t1

你会拉小提琴吗?我不清楚你在询问结束时想要什么。它只是最终的过滤集,还是所有的过滤集?你在使用什么数据库?嗨,在查询结束时,我将拥有相同的数据集,但在一个新列中为每个人分配了组,通过左连接,我可以说这个人属于这个组…我现在在外面,我回家后会发布尽可能多的信息,谢谢。嗨,谢谢你的回答,然而,在我的情况下,这种方法不起作用,因为同一个人可以分为不同的类别,我需要同一个人保持在分配给他们的原始类别中,我希望我的解释有点清楚,谢谢在这种情况下,(这在你的问题中根本不清楚),我将使用一个布尔值使每个类别在视图中成为自己的列,该布尔值指示行是否是该类别的成员。顺便说一句,你可能想编辑这个问题,因为你使用的排除(在所有大写字母中)倾向于表明分组是相互排斥的。嗨,已经有一段时间了,我再次着手解决这个问题,但我遵循了你的建议,通过给它们一个重要顺序的数值,然后用最小值分配一个类别,我能够将类别与案例一起放置,这大大加快了我的查询速度,如果你想要信息,我可以稍后发布我的解决方案,谢谢。
select  t1.refid_eClinibase
        ,t1.[dthrfinmouvement]
        ,t1.[unite_service_id]
        ,t1.[unite_service_suiv_id]
        CASE    WHEN [dthrfinmouvement] = '4000-01-01' THEN 'Group1 Label'
                WHEN condition2 = something THEN 'Group2 Label'
                ....
                WHEN conditionN = something THEN 'GroupN Label'
                ELSE 'Catch All Label'
        END as person_category
from sometable t1