|
I'm looking for opinions/options/fact on joins vs. subselects -- especially when coalesce is involved. I needed to change a view I have yesterday. Historically we took a value from one file and joined to another file to get a description, simple enough (ok, the view did more, but it's not relevant to this problem). However, I had to enhance the view to take the value from one of two spots depending on which was null. However, while I can "select coalesce(fld1, fld2) from..." I don't seem to be able to "join file2 on coalesce(fld1,fld2) = fld3". Is that correct that I can't join w/a coalesce in the join predicate? Second, this forced me to move to a subselect instead of a join since in the subselect I can use the coalesce() in the where clause of the subselect. I guess my question is, does anyone know a way to do what I wanted with a join, as I'm assuming the join would be more efficient, or does it not matter? FWIW, the complete view is below, if anyone wants to see the whole thing. -Walden CREATE VIEW WALDENL/CVSVIEW01X ( PET_MEDICAL_RECORD_NO, CVS_CLINIC_VISIT_DATE, CVS_CLINIC_VISIT_DATE_ISO, CVS_CLINIC_VISIT_TIME, CVS_CLINIC_VISIT_TIME_ISO, RSV_CODE, RSV_DESCRIPTION, SUP_USER_NAME, SUP_FULL_NAME, SUP_DOCTOR_YESNO, REF_VET_ETT_CODE, REF_VET_ETM_CODE, REF_VET_FULL_NAME, REF_PRACT_ETT_CODE, REF_PRACT_ETM_CODE, REF_PRACT_NAME, PET_NAME, PET_OWNER_NAME, PET_SPECIES_BREED, RSV_CODE_ON_VISIT ) AS SELECT CVS.BRAZCD, CVS.BRATD8, CASE WHEN CVS.BRATD8 = 0 THEN DATE(VARCHAR('0001-01-01',10)) WHEN LEFT(DIGITS(CVS.BRATD8),1) = '0' THEN DATE(VARCHAR('19' CONCAT SUBSTR(DIGITS(CVS.BRATD8),2,2) CONCAT '-' CONCAT SUBSTR(DIGITS(CVS.BRATD8),4,2) CONCAT '-' CONCAT SUBSTR(DIGITS(CVS.BRATD8),6,2),10)) ELSE DATE(VARCHAR('20' CONCAT SUBSTR(DIGITS(CVS.BRATD8),2,2) CONCAT '-' CONCAT SUBSTR(DIGITS(CVS.BRATD8),4,2) CONCAT '-' CONCAT SUBSTR(DIGITS(CVS.BRATD8),6,2),10)) END, CVS.BRAGTM, CASE WHEN CVS.BRAGTM = 0 THEN TIME(VARCHAR('00.00.00',8)) ELSE TIME(VARCHAR(LEFT(DIGITS(CVS.BRAGTM),2) CONCAT '.' CONCAT SUBSTR(DIGITS(CVS.BRAGTM),3,2) CONCAT '.' CONCAT SUBSTR(DIGITS(CVS.BRAGTM),5,2),8)) END, --BRBYCD, COALESCE(DZBYCD, BRBYCD), --B4CATX, (SELECT B4CATX FROM RSVPHY01 WHERE B4BYCD = COALESCE(DZBYCD, BRBYCD)), CVS.BRAJVN, RTRIM(SUP.ADAJTX) CONCAT ', ' CONCAT RTRIM(SUP.ADAKTX) CONCAT ' ' CONCAT SUP.ADAMTX, SUP.ADB1ST, CVS.BRC3CD, CVS.BRC4CD, CASE WHEN RFV.AYA6TX IS NULL THEN ' ' ELSE (RTRIM(RFV.AYA6TX) CONCAT ', ' CONCAT RTRIM(RFV.AYA8TX) CONCAT ' ' CONCAT RFV.AYA7TX) END, CVS.BRC5CD, CVS.BRC6CD, CASE WHEN RFP.AZAJNA IS NULL THEN ' ' ELSE RFP.AZAJNA END, PET.AWA1TX, RTRIM(CLI.A8BFTX) CONCAT ', ' CONCAT RTRIM(CLI.A8BGTX) CONCAT ' ' CONCAT RTRIM(CLI.A8BHTX), RTRIM(SPS.AIAQTX) CONCAT '-' CONCAT RTRIM(BRD.AJARTX), BRBYCD FROM CVSPHY01 as CVS INNER JOIN CLIPHY01 AS CLI ON CLI.A8AOCD = CVS.BRAOCD AND CLI.A8APCD = CVS.BRAPCD INNER JOIN PETPHY01 AS PET ON CVS.BRAZCD = PET.AWAZCD INNER JOIN SPSPHY01 AS SPS ON PET.AWAJCD = SPS.AIAJCD INNER JOIN BRDPHY01 AS BRD ON PET.AWAJCD = BRD.AJAJCD AND PET.AWC1CD = BRD.AJC1CD INNER JOIN SUPPHY01 AS SUP ON CVS.BRAJVN = SUP.ADAJVN LEFT OUTER JOIN RFVPHY01 AS RFV ON CVS.BRC3CD = RFV.AYAOCD AND CVS.BRC4CD = RFV.AYAPCD LEFT OUTER JOIN RFPPHY01 AS RFP ON CVS.BRC5CD = RFP.AZAOCD AND CVS.BRC6CD = RFP.AZAPCD LEFT OUTER JOIN ATSPHY01 ATS ON CVS.BRAZCD = ATS.DZAZCD AND CVS.BRATD8 = ATS.DZATD8 AND CVS.BRAGTM = ATS.DZAGTM AND DZATDT * 1000000 + DZANTM=( SELECT MAX(DZATDT * 1000000 + DZANTM) FROM ATSPHY01 B WHERE ATS.DZAZCD=B.DZAZCD AND ATS.DZATD8=B.DZATD8 AND ATS.DZAGTM=B.DZAGTM) --INNER JOIN RSVPHY01 as RSV on -- COALESCE(ATS.DZBYCD, CVS.BRBYCD) = RSV.B4BYCD WHERE RFV.AYAPCD IS NOT NULL OR RFP.AZAPCD IS NOT NULL ------------ Walden H Leverich III Tech Software (516) 627-3800 x11 WaldenL@xxxxxxxxxxxxxxx http://www.TechSoftInc.com <blocked::http://www.techsoftinc.com/> Quiquid latine dictum sit altum viditur. (Whatever is said in Latin seems profound.)
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.