Hi,
I am running a following query in DB2 and getting SQL0338n error.
This is primarily because, there are subqueries at few places (marked in bold)in the main query, after 'ON' clause.
Could anyone please help me, as how these subqueries can be replaced without change in resultset?
Thanks,
Tejas.
--------------------------------------------------------------------------------
Select
.
.
.
FROM join_is JID
LEFT OUTER JOIN AD_PH ph
ON JID.h_num=ph.h_ num
AND JID.ph_ts=ph.ts
LEFT OUTER JOIN AD_COM cmd
ON ph.cmd_cd = cmd.cmd_cd
AND cmd.ts =
(
SELECT max(ts)
FROM AD_COM cmd_sub
WHERE cmd_sub.v_frm <= @start
AND cmd_sub.cmd_cd = ph.cmd_cd
) LEFT OUTER JOIN AD_PS ps
ON JID.p_num=ps.p_ num
AND JID.ps_ts=ps.ts
LEFT OUTER JOIN PSM
ON JID.p_num=PSM.p _num
LEFT OUTER JOIN AD_FORM af
ON JID.h_num = af.h_num
AND af.ts =
(
SELECT max(ts)
FROM AD_FORM af_sub
WHERE af_sub.v_frm <= @start
AND af_sub.h_num = JID.h_num
) LEFT OUTER JOIN AD_FC afc
ON JID.h_num = afc.h_num
AND afc.ts =
(
SELECT max(ts)
FROM AD_FC afc_sub
WHERE afc_sub.v_frm <= @start
AND afc_sub.h_num = JID.h_num
),
AD_PCR pcr
LEFT OUTER JOIN
(
SELECT sub_p.ps_num AS m_ps_num, max(f_pr_dt) AS match_f_pr_dt
FROM AD_PCR sub_p, PSM ps_ids
WHERE sub_p.ps_num = ps_ids.ps_num
AND sub_p.ts =
(SELECT MAX(ts) FROM AD_PCR sub_p2 WHERE sub_p2.p_num = sub_p.p_num AND sub_p2.v_frm < @end)
AND sub_p.ad_ty_ind != 'D'
AND sub_p.td_st_ind != 'C'
GROUP BY sub_p.ps_num
HAVING MAX(sub_p.f_pr_ dt) <= @start
) match ON match.m_ps_num = pcr.ps_num
LEFT OUTER JOIN #efp efp ON efp.p_num = pcr.p_num
LEFT OUTER JOIN AD_BD bd
ON bd.p_num IN
(
SELECT head_bd.p_num
FROM AD_BD head_bd
WHERE head_bd.bd_num = pcr.bd_num
AND head_bd.ts =
(
SELECT max(ts)
FROM AD_BD head_bd_sub
WHERE head_bd_sub.v_f rm <= @start
AND head_bd_sub.bd_ num = head_bd.bd_num
)
)AND bd.ts =
(
SELECT max(ts)
FROM AD_BD bd_sub
WHERE bd_sub.v_frm <= @start
AND bd.bd_num = bd_sub.bd_num
)
AND bd.pump_dt IS NOT NULL
AND bd.ad_ty_ind != 'D'
AND NOT EXISTS
(
SELECT 1
FROM AD_BD bd_sub2
WHERE bd_sub2.p_num = bd.p_num
AND bd_sub2.ts != bd.ts
AND bd_sub2.ad_ty_i nd != 'D'
AND
(
bd_sub2.pump_dt IS NULL
OR (bd.pump_dt <= bd.v_frm AND bd_sub2.ts > bd.ts)
OR (bd.pump_dt > bd.v_frm AND (bd_sub2.pump_d t > bd.pump_dt OR bd_sub2.v_frm > bd.pump_dt))
)
AND bd_sub2.ts =
(
SELECT max(ts)
FROM AD_BD bd_sub3
WHERE bd_sub3.v_frm <= @start
AND bd_sub3.bd_num = bd_sub2.bd_num
) )
LEFT OUTER JOIN AD_CNT cntr
ON pcr.cnt_num = cntr.cnt_num
AND cntr.ts =
(
SELECT max(ts)
FROM AD_CNT cntr_sub
WHERE cntr_sub.v_frm <= @start
AND cntr_sub.cnt_nu m = pcr.cnt_num
)
I am running a following query in DB2 and getting SQL0338n error.
This is primarily because, there are subqueries at few places (marked in bold)in the main query, after 'ON' clause.
Could anyone please help me, as how these subqueries can be replaced without change in resultset?
Thanks,
Tejas.
--------------------------------------------------------------------------------
Select
.
.
.
FROM join_is JID
LEFT OUTER JOIN AD_PH ph
ON JID.h_num=ph.h_ num
AND JID.ph_ts=ph.ts
LEFT OUTER JOIN AD_COM cmd
ON ph.cmd_cd = cmd.cmd_cd
AND cmd.ts =
(
SELECT max(ts)
FROM AD_COM cmd_sub
WHERE cmd_sub.v_frm <= @start
AND cmd_sub.cmd_cd = ph.cmd_cd
) LEFT OUTER JOIN AD_PS ps
ON JID.p_num=ps.p_ num
AND JID.ps_ts=ps.ts
LEFT OUTER JOIN PSM
ON JID.p_num=PSM.p _num
LEFT OUTER JOIN AD_FORM af
ON JID.h_num = af.h_num
AND af.ts =
(
SELECT max(ts)
FROM AD_FORM af_sub
WHERE af_sub.v_frm <= @start
AND af_sub.h_num = JID.h_num
) LEFT OUTER JOIN AD_FC afc
ON JID.h_num = afc.h_num
AND afc.ts =
(
SELECT max(ts)
FROM AD_FC afc_sub
WHERE afc_sub.v_frm <= @start
AND afc_sub.h_num = JID.h_num
),
AD_PCR pcr
LEFT OUTER JOIN
(
SELECT sub_p.ps_num AS m_ps_num, max(f_pr_dt) AS match_f_pr_dt
FROM AD_PCR sub_p, PSM ps_ids
WHERE sub_p.ps_num = ps_ids.ps_num
AND sub_p.ts =
(SELECT MAX(ts) FROM AD_PCR sub_p2 WHERE sub_p2.p_num = sub_p.p_num AND sub_p2.v_frm < @end)
AND sub_p.ad_ty_ind != 'D'
AND sub_p.td_st_ind != 'C'
GROUP BY sub_p.ps_num
HAVING MAX(sub_p.f_pr_ dt) <= @start
) match ON match.m_ps_num = pcr.ps_num
LEFT OUTER JOIN #efp efp ON efp.p_num = pcr.p_num
LEFT OUTER JOIN AD_BD bd
ON bd.p_num IN
(
SELECT head_bd.p_num
FROM AD_BD head_bd
WHERE head_bd.bd_num = pcr.bd_num
AND head_bd.ts =
(
SELECT max(ts)
FROM AD_BD head_bd_sub
WHERE head_bd_sub.v_f rm <= @start
AND head_bd_sub.bd_ num = head_bd.bd_num
)
)AND bd.ts =
(
SELECT max(ts)
FROM AD_BD bd_sub
WHERE bd_sub.v_frm <= @start
AND bd.bd_num = bd_sub.bd_num
)
AND bd.pump_dt IS NOT NULL
AND bd.ad_ty_ind != 'D'
AND NOT EXISTS
(
SELECT 1
FROM AD_BD bd_sub2
WHERE bd_sub2.p_num = bd.p_num
AND bd_sub2.ts != bd.ts
AND bd_sub2.ad_ty_i nd != 'D'
AND
(
bd_sub2.pump_dt IS NULL
OR (bd.pump_dt <= bd.v_frm AND bd_sub2.ts > bd.ts)
OR (bd.pump_dt > bd.v_frm AND (bd_sub2.pump_d t > bd.pump_dt OR bd_sub2.v_frm > bd.pump_dt))
)
AND bd_sub2.ts =
(
SELECT max(ts)
FROM AD_BD bd_sub3
WHERE bd_sub3.v_frm <= @start
AND bd_sub3.bd_num = bd_sub2.bd_num
) )
LEFT OUTER JOIN AD_CNT cntr
ON pcr.cnt_num = cntr.cnt_num
AND cntr.ts =
(
SELECT max(ts)
FROM AD_CNT cntr_sub
WHERE cntr_sub.v_frm <= @start
AND cntr_sub.cnt_nu m = pcr.cnt_num
)
Comment