Tsql tdate>=“2010年4月1日” 和(I.AdTimeD< PAR.DTDTTM或PAR.DEDTTM是空的) [地位] =“A” [识别类型] =“病人” 和PAR.[RoType代码] = 'CcCu'UnalAd' 和pa.[adtypcode]

Tsql tdate>=“2010年4月1日” 和(I.AdTimeD< PAR.DTDTTM或PAR.DEDTTM是空的) [地位] =“A” [识别类型] =“病人” 和PAR.[RoType代码] = 'CcCu'UnalAd' 和pa.[adtypcode],tsql,subquery,exists,cross-apply,Tsql,Subquery,Exists,Cross Apply,tdate>=“2010年4月1日” 和(I.AdTimeD< PAR.DTDTTM或PAR.DEDTTM是空的) [地位] =“A” [识别类型] =“病人” 和PAR.[RoType代码] = 'CcCu'UnalAd' 和pa.[adtypcode]=“地址” 邮政编码i.邮政编码; 为什么不左连接?因为主连接对PK是1-1。所以?这又有什么关系呢?交叉应用就像内部连接,不同之处在于它也可以用于子查询和表值函数。它不慢。在这种情况下,使用join和更清晰的代码可以获得相同的结果。慢的原因不

tdate>=“2010年4月1日” 和(I.AdTimeD< PAR.DTDTTM或PAR.DEDTTM是空的) [地位] =“A” [识别类型] =“病人” 和PAR.[RoType代码] = 'CcCu'UnalAd' 和pa.[adtypcode]=“地址” 邮政编码i.邮政编码;
为什么不
左连接
?因为主连接对PK是1-1。所以?这又有什么关系呢?交叉应用就像内部连接,不同之处在于它也可以用于子查询和表值函数。它不慢。在这种情况下,使用join和更清晰的代码可以获得相同的结果。慢的原因不是交叉应用。你错了:“交叉应用是用来与表值函数一起使用的,它的工作原理有点像光标,一次一条记录,比设置操作慢得多。”应用和连接一样快。
DECLARE @Master TABLE
  (
     heyno              NVARCHAR(12),
     postcodestartdttm  DATE,
     postcodeenddttm    DATE,
     lzohistorypostcode NVARCHAR(25),
     biactivitypostcode NVARCHAR(25),
     activityenddttm    DATE
  );

INSERT INTO @Master
SELECT p.pasid,
       par.startdttm,
       par.enddttm,
       pa.postcode AS LZOHistoryPostcode,
       t.postcode  AS BIActivityPostcode,
       t.admitdate
FROM   HEALTHBI.DBO.[lzo_patientaddressrole] AS par
       INNER JOIN HEALTHBI.DBO.[lzo_patientaddress] AS pa
               ON par.[addressoid] = pa.[oid]
                  AND pa.[status] = 'A'
       INNER JOIN HEALTHBI.DBO.lzo_patient AS p
               ON par.identifyingoid = p.oid
       --- 
       CROSS APPLY (SELECT i.admitdate,
                           i.postcode
                    FROM   HEALTHBI_VIEWS.DBO.ip_admission i
                    WHERE  i.patientoid = p.oid
                           AND i.admitdate > par.startdttm
                           AND i.admitdate >= '01 APRIL 2010'
                           AND i.admitdate < ISNULL(par.enddttm, '31-dec-4712')
                           AND par.[status] = 'A'
                           AND par.[identifyingtype] = 'Patient'
                           AND par.[rotypcode] = 'CC_USUALADD'
                           AND pa.[adtypcode] = 'Address'
                           AND pa.postcode <> i.postcode) AS t

INSERT INTO @Master
SELECT p.pasid,
       par.startdttm,
       par.enddttm,
       pa.postcode AS LZOHistoryPostcode,
       t.postcode  AS BIActivityPostcode,
       t.apptstartdate
FROM   HEALTHBI.DBO.[lzo_patientaddressrole] AS par
       INNER JOIN HEALTHBI.DBO.[lzo_patientaddress] AS pa
               ON par.[addressoid] = pa.[oid]
                  AND pa.[status] = 'A'
       INNER JOIN HEALTHBI.DBO.lzo_patient AS p
               ON par.identifyingoid = p.oid
       CROSS APPLY (SELECT i.apptstartdate,
                           i.postcode
                    FROM   HEALTHBI_VIEWS.DBO.op_appointment i
                    WHERE  i.patientoid = p.oid
                           AND i.apptstartdate > par.startdttm
                           AND i.apptstartdate >= '01 APRIL 2010'
                           AND i.apptstartdate < ISNULL(par.enddttm, '31-dec-4712')
                           AND par.[status] = 'A'
                           AND par.[identifyingtype] = 'Patient'
                           AND par.[rotypcode] = 'CC_USUALADD'
                           AND pa.[adtypcode] = 'Address'
                           AND pa.postcode <> i.postcode) AS t

INSERT INTO @Master
SELECT p.pasid,
       par.startdttm,
       par.enddttm,
       pa.postcode AS LZOHistoryPostcode,
       t.postcode  AS BIActivityPostcode,
       t.attenddate
FROM   HEALTHBI.DBO.[lzo_patientaddressrole] AS par
       INNER JOIN HEALTHBI.DBO.[lzo_patientaddress] AS pa
               ON par.[addressoid] = pa.[oid]
                  AND pa.[status] = 'A'
       INNER JOIN HEALTHBI.DBO.lzo_patient AS p
               ON par.identifyingoid = p.oid
       CROSS APPLY (SELECT i.attenddate,
                           i.postcode
                    FROM   HEALTHBI_VIEWS.DBO.ed_attendance i
                    WHERE  i.patientoid = p.oid
                           AND i.attenddate > par.startdttm
                           AND i.attenddate >= '01 APRIL 2010'
                           AND i.attenddate < ISNULL(par.enddttm, '31-dec-4712')
                           AND par.[status] = 'A'
                           AND par.[identifyingtype] = 'Patient'
                           AND par.[rotypcode] = 'CC_USUALADD'
                           AND pa.[adtypcode] = 'Address'
                           AND pa.postcode <> i.postcode) AS t

SELECT m.heyno,
       m.lzohistorypostcode,
       m.biactivitypostcode,
       d.startofweek
FROM   @Master m
       INNER JOIN HEALTHBI_VIEWS.DBO.date_reference AS d
               ON m.activityenddttm = d.datevalue
GROUP  BY m.heyno,
          m.lzohistorypostcode,
          m.biactivitypostcode,
          d.startofweek
ORDER  BY m.heyno 
SELECT p.pasid,
       par.startdttm,
       par.enddttm,
       pa.postcode AS LZOHistoryPostcode,
       i.postcode  AS BIActivityPostcode,
       i.admitdate
FROM   HEALTHBI.DBO.[lzo_patientaddressrole] AS par
       INNER JOIN HEALTHBI.DBO.[lzo_patientaddress] AS pa
               ON par.[addressoid] = pa.[oid]
                  AND pa.[status] = 'A'
       INNER JOIN HEALTHBI.DBO.lzo_patient AS p
               ON par.identifyingoid = p.oid
       --- 
       LEFT OUTER JOIN HEALTHBI_VIEWS.DBO.ip_admission i
        ON i.patientoid = p.oid

WHERE  i.admitdate > par.startdttm
                           AND i.admitdate >= '01 APRIL 2010'
                           AND (i.admitdate < par.enddttm OR par.enddttm IS NULL)
                           AND par.[status] = 'A'
                           AND par.[identifyingtype] = 'Patient'
                           AND par.[rotypcode] = 'CC_USUALADD'
                           AND pa.[adtypcode] = 'Address'
                           AND pa.postcode <> i.postcode;