finance_teacher
asked on
Oracle -- SQL SELECT -- UNION
I currently run the below to
get ID_DESC & ID_BRAND changes.
How can I make this query shorter
by using just a SELECT statement ?
** tables attached
-------------------------- ---------- ---------- ---------- ---------- ---------- -------
SELECT new.ID_STK_NO SKU, new.ID_DESC NAME,
'ID_DESC' CHANGE_TYPE,
old.ID_DESC OLDVALUE, new.ID_DESC NEWVALUE, new.ID_SOURCE
FROM GML_IMPORT_ITEMMSTR new
LEFT JOIN GML_IMPORT_ITEMMSTR_OS old
ON new.ID_STK_NO=old.ID_STK_N O
WHERE nvl(new.ID_DESC,'x') != nvl(old.ID_DESC,'x')
and
(
new.ID_SOURCE in ('F','P')
or
old.ID_SOURCE in ('F','P')
)
and
(
new.ID_BRAND in ('ALBRT', 'AMIGO', 'CMRKT', 'CUBFD', 'DMNCK',
'FLRIT', 'FDLAN', 'GRTVL', 'IGA..', 'RCHFD',
'RILEY', 'SAFWY', 'SCOTT', 'SH&'||'SV', 'SHPVL',
'WEGMN')
or
old.ID_BRAND in ('ALBRT', 'AMIGO', 'CMRKT', 'CUBFD', 'DMNCK',
'FLRIT', 'FDLAN', 'GRTVL', 'IGA..', 'RCHFD',
'RILEY', 'SAFWY', 'SCOTT', 'SH&'||'SV', 'SHPVL',
'WEGMN')
)
union
SELECT new.ID_STK_NO SKU, new.ID_DESC NAME,
'ID_BRAND' CHANGE_TYPE,
old.ID_BRAND OLDVALUE, new.ID_BRAND NEWVALUE, new.ID_SOURCE
FROM GML_IMPORT_ITEMMSTR new
LEFT JOIN GML_IMPORT_ITEMMSTR_OS old
ON new.ID_STK_NO=old.ID_STK_N O
WHERE nvl(new.ID_BRAND,'x') != nvl(old.ID_BRAND,'x')
and
(
new.ID_SOURCE in ('F','P')
or
old.ID_SOURCE in ('F','P')
)
and
(
new.ID_BRAND in ('ALBRT', 'AMIGO', 'CMRKT', 'CUBFD', 'DMNCK',
'FLRIT', 'FDLAN', 'GRTVL', 'IGA..', 'RCHFD',
'RILEY', 'SAFWY', 'SCOTT', 'SH&'||'SV', 'SHPVL',
'WEGMN')
or
old.ID_BRAND in ('ALBRT', 'AMIGO', 'CMRKT', 'CUBFD', 'DMNCK',
'FLRIT', 'FDLAN', 'GRTVL', 'IGA..', 'RCHFD',
'RILEY', 'SAFWY', 'SCOTT', 'SH&'||'SV', 'SHPVL',
'WEGMN')
)
ORDER BY SKU, CHANGE_TYPE
tables.txt
get ID_DESC & ID_BRAND changes.
How can I make this query shorter
by using just a SELECT statement ?
** tables attached
--------------------------
SELECT new.ID_STK_NO SKU, new.ID_DESC NAME,
'ID_DESC' CHANGE_TYPE,
old.ID_DESC OLDVALUE, new.ID_DESC NEWVALUE, new.ID_SOURCE
FROM GML_IMPORT_ITEMMSTR new
LEFT JOIN GML_IMPORT_ITEMMSTR_OS old
ON new.ID_STK_NO=old.ID_STK_N
WHERE nvl(new.ID_DESC,'x') != nvl(old.ID_DESC,'x')
and
(
new.ID_SOURCE in ('F','P')
or
old.ID_SOURCE in ('F','P')
)
and
(
new.ID_BRAND in ('ALBRT', 'AMIGO', 'CMRKT', 'CUBFD', 'DMNCK',
'FLRIT', 'FDLAN', 'GRTVL', 'IGA..', 'RCHFD',
'RILEY', 'SAFWY', 'SCOTT', 'SH&'||'SV', 'SHPVL',
'WEGMN')
or
old.ID_BRAND in ('ALBRT', 'AMIGO', 'CMRKT', 'CUBFD', 'DMNCK',
'FLRIT', 'FDLAN', 'GRTVL', 'IGA..', 'RCHFD',
'RILEY', 'SAFWY', 'SCOTT', 'SH&'||'SV', 'SHPVL',
'WEGMN')
)
union
SELECT new.ID_STK_NO SKU, new.ID_DESC NAME,
'ID_BRAND' CHANGE_TYPE,
old.ID_BRAND OLDVALUE, new.ID_BRAND NEWVALUE, new.ID_SOURCE
FROM GML_IMPORT_ITEMMSTR new
LEFT JOIN GML_IMPORT_ITEMMSTR_OS old
ON new.ID_STK_NO=old.ID_STK_N
WHERE nvl(new.ID_BRAND,'x') != nvl(old.ID_BRAND,'x')
and
(
new.ID_SOURCE in ('F','P')
or
old.ID_SOURCE in ('F','P')
)
and
(
new.ID_BRAND in ('ALBRT', 'AMIGO', 'CMRKT', 'CUBFD', 'DMNCK',
'FLRIT', 'FDLAN', 'GRTVL', 'IGA..', 'RCHFD',
'RILEY', 'SAFWY', 'SCOTT', 'SH&'||'SV', 'SHPVL',
'WEGMN')
or
old.ID_BRAND in ('ALBRT', 'AMIGO', 'CMRKT', 'CUBFD', 'DMNCK',
'FLRIT', 'FDLAN', 'GRTVL', 'IGA..', 'RCHFD',
'RILEY', 'SAFWY', 'SCOTT', 'SH&'||'SV', 'SHPVL',
'WEGMN')
)
ORDER BY SKU, CHANGE_TYPE
tables.txt
becasue you wanted everything in one query without using union, we need to have extra column in the above query to get the information you are looking for.
provide some sample data for 2 or 3 records in each table and say what output is coming for the old union query and what output you need without using the union query.
If for one record, it can be only either ID_DESC or ID_BRAND changed, try this
Select new.ID_STK_NO SKU, new.ID_DESC NAME,
Case When nvl(new.ID_DESC,'x') != nvl(old.ID_DESC,'x') Then 'ID_DESC' Else 'ID_BRAND' End As CHANGE_TYPE,
Case When nvl(new.ID_DESC,'x') != nvl(old.ID_DESC,'x') Then old.ID_DESC Else old.ID_BRAND End As OLDVALUE ,
Case When nvl(new.ID_DESC,'x') != nvl(old.ID_DESC,'x') Then new.ID_DESC Else new.ID_BRAND End As NEWVALUE,
new.ID_SOURCE
FROM GML_IMPORT_ITEMMSTR new
LEFT JOIN GML_IMPORT_ITEMMSTR_OS Old ON new.ID_STK_NO=old.ID_STK_N O
WHERE (nvl(new.ID_DESC,'x') != nvl(old.ID_DESC,'x') Or nvl(new.ID_BRAND,'x') != nvl(old.ID_BRAND,'x'))
And ( new.ID_SOURCE in ('F','P') Or old.ID_SOURCE in ('F','P'))
and
(
new.ID_BRAND in ('ALBRT', 'AMIGO', 'CMRKT', 'CUBFD', 'DMNCK',
'FLRIT', 'FDLAN', 'GRTVL', 'IGA..', 'RCHFD',
'RILEY', 'SAFWY', 'SCOTT', 'SH&'||'SV', 'SHPVL',
'WEGMN')
Or
old.ID_BRAND in ('ALBRT', 'AMIGO', 'CMRKT', 'CUBFD', 'DMNCK',
'FLRIT', 'FDLAN', 'GRTVL', 'IGA..', 'RCHFD',
'RILEY', 'SAFWY', 'SCOTT', 'SH&'||'SV', 'SHPVL',
'WEGMN')
)
Select new.ID_STK_NO SKU, new.ID_DESC NAME,
Case When nvl(new.ID_DESC,'x') != nvl(old.ID_DESC,'x') Then 'ID_DESC' Else 'ID_BRAND' End As CHANGE_TYPE,
Case When nvl(new.ID_DESC,'x') != nvl(old.ID_DESC,'x') Then old.ID_DESC Else old.ID_BRAND End As OLDVALUE ,
Case When nvl(new.ID_DESC,'x') != nvl(old.ID_DESC,'x') Then new.ID_DESC Else new.ID_BRAND End As NEWVALUE,
new.ID_SOURCE
FROM GML_IMPORT_ITEMMSTR new
LEFT JOIN GML_IMPORT_ITEMMSTR_OS Old ON new.ID_STK_NO=old.ID_STK_N
WHERE (nvl(new.ID_DESC,'x') != nvl(old.ID_DESC,'x') Or nvl(new.ID_BRAND,'x') != nvl(old.ID_BRAND,'x'))
And ( new.ID_SOURCE in ('F','P') Or old.ID_SOURCE in ('F','P'))
and
(
new.ID_BRAND in ('ALBRT', 'AMIGO', 'CMRKT', 'CUBFD', 'DMNCK',
'FLRIT', 'FDLAN', 'GRTVL', 'IGA..', 'RCHFD',
'RILEY', 'SAFWY', 'SCOTT', 'SH&'||'SV', 'SHPVL',
'WEGMN')
Or
old.ID_BRAND in ('ALBRT', 'AMIGO', 'CMRKT', 'CUBFD', 'DMNCK',
'FLRIT', 'FDLAN', 'GRTVL', 'IGA..', 'RCHFD',
'RILEY', 'SAFWY', 'SCOTT', 'SH&'||'SV', 'SHPVL',
'WEGMN')
)
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
SELECT new.ID_STK_NO SKU, new.ID_DESC NAME,
'ID_BRAND' CHANGE_TYPE,
old.ID_BRAND OLDVALUE, new.ID_BRAND NEWVALUE,
'ID_DESC' CHANGE_TYPE1,
old.ID_DESC OLDVALUE1, new.ID_DESC NEWVALUE1,
new.ID_SOURCE
FROM GML_IMPORT_ITEMMSTR new
LEFT JOIN GML_IMPORT_ITEMMSTR_OS old
ON new.ID_STK_NO=old.ID_STK_N
WHERE (
nvl(new.ID_DESC,'x') != nvl(old.ID_DESC,'x')
or nvl(new.ID_BRAND,'x') != nvl(old.ID_BRAND,'x') )
and
( new.ID_SOURCE in ('F','P') or old.ID_SOURCE in ('F','P') )
and
(
new.ID_BRAND in ('ALBRT', 'AMIGO', 'CMRKT', 'CUBFD', 'DMNCK',
'FLRIT', 'FDLAN', 'GRTVL', 'IGA..', 'RCHFD',
'RILEY', 'SAFWY', 'SCOTT', 'SH&'||'SV', 'SHPVL',
'WEGMN')
or
old.ID_BRAND in ('ALBRT', 'AMIGO', 'CMRKT', 'CUBFD', 'DMNCK',
'FLRIT', 'FDLAN', 'GRTVL', 'IGA..', 'RCHFD',
'RILEY', 'SAFWY', 'SCOTT', 'SH&'||'SV', 'SHPVL',
'WEGMN')
)