Reputation: 1
Can anyone help? I'm a noob on scripts.. The script below (without the BOLDED section gives me empty result) and if i include the BOLDED section, it tells me too many values.
Actually for the bolded section, what i wanted is to extract from three different tables.
TABLE A (OR_ORDER) it consists of
ID | CLASS | FACILITY | SOURCE_TYPE | SOURCE_CODE
101 IP XY N W010
102 IP XY N W023
103 OP SX C E122
114 OP XY C R123
TABLE D (IP_NURSING_UNIT) it consists of
NURSING_UNIT_CODE | SOURCE_TYPE | LONG_DESC
W010 N Ward 10
W023 N Ward 23
TABLE H (OP_CLINIC) it consists of
CLINIC_CODE | SOURCE_TYPE | LONG_DESC
E122 C Eye Clinic
R123 C Dental
I want the expected output to be as below..just adding on long_desc column... depending on source_type. If source_type is N, then it should extract data from table D ..and if source_type is C, then it should extract data from table H..but I don't know how to join them..
ID | CLASS | FACILITY | SOURCE_TYPE | SOURCE_CODE | LONG_DESC
101 IP XY N W010 Ward 10
102 IP XY N W023 Ward 23
103 OP SX C E122 Eye Clinic
114 OP XY C R123 Dental
Query:
SELECT
A.ID, A.CLASS, C.FACILITY_NAME, A.SOURCE_TYPE,
(SELECT a.source_code, d.LONG_DESC
FROM OR_ORDER A
INNER JOIN IP_NURSING_UNIT D ON a.source_code = d.nursing_unit_code
INNER JOIN OP_CLINIC H ON a.source_code = h.clinic_code),
B.ORDER_ID, B.ORDER_CATALOG_CODE, B.CATALOG_DESC,
B.START_DATE_TIME, B.END_DATE_TIME, B.ORDER_QTY,
F.LONG_DESC, G.PUBLIC_PRICE, E.PRACTITIONER_NAME
FROM
OR_ORDER A, OR_ORDER_LINE B, SM_FACILITY_PARAM C,
IP_NURSING_UNIT D, AM_PRACTITIONER E, AM_UOM F,
BL_ST_ITEM_BY_PERIOD G, OP_CLINIC H
WHERE
A.CLASS = 'OP'
AND A.ORDER_ID = B.ORDER_ID
AND A.ORDERING_FACILITY_ID = C.FACILITY_ID
AND A.ORDERING_FACILITY_ID = D.FACILITY_ID
AND A.ORDERING_FACILITY_ID = H.FACILITY_ID
AND A.SOURCE_CODE = D.NURSING_UNIT_CODE
AND A.SOURCE_CODE =H.CLINIC_CODE
AND B.ORD_PRACT_ID = E.PRACTITIONER_ID
AND (G.item_code = B.ORDER_CATALOG_CODE
AND G.OPERATING_FACILITY_ID = 'RP' AND G.EFFECTIVE_TO_DATE IS NULL)
AND B.ORDER_UOM = F.UOM_CODE AND B.ORD_DATE_TIME BETWEEN TO_DATE('05/02/2016 08:20:00', 'MM/DD/YYYY HH24:MI:SS') AND
TO_DATE('05/02/2016 08:30:00', 'MM/DD/YYYY HH24:MI:SS') ORDER BY B.ORD_PRACT_ID
Any help is greatly appreciated. Thanks in advance
Upvotes: 0
Views: 43
Reputation: 1270021
You would appear to want a left join
:
select o.*, coalesce(nu.long_desc, c.long_desc) as long_desc
from or_order o left join
ip_nursing_unit nu
on o.source_code = nu.source_code and
o.source_type = nu.source_type left join
op_clinic c
on o.source_code = c.source_code and
o.source_type = c.source_type;
Your query is way too complicated. In addition, it does not use proper, explicit JOIN
syntax. Simple rule: Never use commas in the FROM
clause. Always use proper, explicit JOIN
syntax.
You may have other conditions you want to add to the query.
Upvotes: 2