如何在此存储过程中使用EXCEPT?

时间:2012-10-05 14:36:18

标签: sql-server tsql stored-procedures

我写了一个存储过程:

SELECT 
    Encounter.EncounterNumber, 
    substring(Encounter.EncounterNumber,4,9) as Acct, 
    MedicalRecordNumber, 
    [AdmitDate - CCYYMMDD] as AdmitDate, 
    [DischargeDate - CCYYMMDD] as DischDate, 
    DischargeDisposition, 
    Encounter.Age, 
    EnctrAPR.APRDRG, 
    Age18, Age18To64, Age65
from 
    Encounter
    full outer join EnctrAPR on 
        substring(Encounter.EncounterNumber,4,9) = EnctrAPR.EncounterNumber
where 
    HSP# = 1
    and InOutCode = 'I'
    and ActualTotalCharge >0 
    and AdmitSubService <> 'SIG'
    and [DischargeDate - CCYYMMDD] between @StartDate and @EndDate
    and Encounter.Age >= 18

我想使用EXCEPTINTERSECT指令向我显示EnctrAPR中不属于Encounter的行。请注意,我在两个表上有不同的EncounterNumber格式。

我将如何做到这一点?

2 个答案:

答案 0 :(得分:1)

要获取只是那些Encounter中的记录而不是EnctrAPR中的记录,那么只需使用left outer join而不是full outer join,并添加一个不包括EnctrAPR空值的子句。 EncounterNumber。

SELECT  
    Encounter.EncounterNumber,  
    substring(Encounter.EncounterNumber,4,9) as Acct,  
    ...
    EnctrAPR.APRDRG,
    Age18, Age18To64, Age65 
from  
    Encounter 
    left outer join EnctrAPR on  
        substring(Encounter.EncounterNumber,4,9) = EnctrAPR.EncounterNumber 
where  
    EnctrAPR.EncounterNumber is null
    and HSP# = 1 
    and InOutCode = 'I' 
    and ActualTotalCharge >0  
    and AdmitSubService <> 'SIG' 
    and [DischargeDate - CCYYMMDD] between @StartDate and @EndDate 
    and Encounter.Age >= 18 

请注意,EnctrAPR.APRDRG的值始终为null,因为EnctrAPR没有匹配的行。

答案 1 :(得分:1)

你真的不需要交叉或除了你想要的东西,但你可以这样做。

SELECT Encounter.EncounterNumber, substring(Encounter.EncounterNumber,4,9) as Acct,   
MedicalRecordNumber, [AdmitDate - CCYYMMDD] as AdmitDate, [DischargeDate - CCYYMMDD] as 
DischDate, DischargeDisposition, Encounter.Age, EnctrAPR.APRDRG, Age18, Age18To64, Age65
from Encounter
full outer join EnctrAPR on
substring(Encounter.EncounterNumber,4,9) = EnctrAPR.EncounterNumber
where HSP# = 1
and InOutCode = 'I'
and ActualTotalCharge >0 
and AdmitSubService <> 'SIG'
and [DischargeDate - CCYYMMDD] between @StartDate and @EndDate
and Encounter.Age >= 18
INTERSECT -- OR EXCEPT
SELECT Encounter.EncounterNumber, substring(Encounter.EncounterNumber,4,9) as Acct,   
MedicalRecordNumber, [AdmitDate - CCYYMMDD] as AdmitDate, [DischargeDate - CCYYMMDD] as 
DischDate, DischargeDisposition, Encounter.Age, EnctrAPR.APRDRG, Age18, Age18To64, Age65
from EnctrAPR 
join Encounter on
substring(Encounter.EncounterNumber,4,9) = EnctrAPR.EncounterNumber
where HSP# = 1
and InOutCode = 'I'
and ActualTotalCharge >0 
and AdmitSubService <> 'SIG'
and [DischargeDate - CCYYMMDD] between @StartDate and @EndDate
and Encounter.Age >= 18

你可以这样做,但我不推荐它。这是一种蛮力的方法。要仅获取EnctrAPR中的记录,您可以更改FROM EnctrAPR并使用内部联接来进行Encounter。

SELECT Encounter.EncounterNumber, substring(Encounter.EncounterNumber,4,9) as Acct,   
MedicalRecordNumber, [AdmitDate - CCYYMMDD] as AdmitDate, [DischargeDate - CCYYMMDD] as 
DischDate, DischargeDisposition, Encounter.Age, EnctrAPR.APRDRG, Age18, Age18To64, Age65
from EnctrAPR 
join Encounter on
substring(Encounter.EncounterNumber,4,9) = EnctrAPR.EncounterNumber
where HSP# = 1
and InOutCode = 'I'
and ActualTotalCharge >0 
and AdmitSubService <> 'SIG'
and [DischargeDate - CCYYMMDD] between @StartDate and @EndDate
and Encounter.Age >= 18

要仅获取EnctrApr中不存在的记录,我将使用左连接:

SELECT Encounter.EncounterNumber, substring(Encounter.EncounterNumber,4,9) as Acct,   
MedicalRecordNumber, [AdmitDate - CCYYMMDD] as AdmitDate, [DischargeDate - CCYYMMDD] as 
DischDate, DischargeDisposition, Encounter.Age, EnctrAPR.APRDRG, Age18, Age18To64, Age65
from Encounter 
left outer join EnctrAPR on
substring(Encounter.EncounterNumber,4,9) = EnctrAPR.EncounterNumber
where HSP# = 1
and InOutCode = 'I'
and ActualTotalCharge >0 
and AdmitSubService <> 'SIG'
and [DischargeDate - CCYYMMDD] between @StartDate and @EndDate
and Encounter.Age >= 18
and EnctrAPR.EncounterNumber IS NULL