|
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.