首页 > 解决方案 > 使用 NVL 子句连接多个 Select 语句

问题描述

嗨,我在这里提前感谢所有帮助,

由于我对 SQL 和联接类型相当陌生,因此在这里寻求一些帮助

查询 1

(select ic.ITEM_ID, ic.ITEM_NAME
from ITEM_CBO ic 
where COLOR_DESC = 'BRAND');

查询 2

(select ptt.ITEM_ID, TO_CHAR(MAX(DISTINCT(ptt.CREATE_DATE_TIME)), 'dd/mm/yyyy') as "Last Trans Date"
from PROD_TRKG_TRAN ptt
where ptt.TRAN_TYPE = 500 and ptt.TRAN_CODE = 010 and ptt.MENU_OPTN_NAME = 'LOA Pck Pick Cart'
Group By ptt.ITEM_ID);

查询 3

(select wi.ITEM_ID, sum(wi.ON_HAND_QTY)
from WM_INVENTORY wi
where wi.ITEM_ID in (SELECT ic.ITEM_ID from ITEM_CBO ic where COLOR_DESC = 'BRAND')
group by wi.ITEM_ID);

我正在尝试加入上述查询的结果以返回以下内容

查询 1(列)的所有结果与查询 2(列ic.ITEM_NAME)的匹配结果TO_CHAR(MAX(DISTINCT(ptt.CREATE_DATE_TIME)), 'dd/mm/yyyy') as "Last Trans Date"查询 3(sum(wi.ON_HAND_QTY

所有连接都可以使用每个子查询中的 ITEM_ID 执行,

不太确定如何包含 NVL 以说明查询 2 和 3 中不存在的记录

标签: sqloraclejoinsubquerynvl

解决方案


我不认为这是NVL您要寻找的,而是external join

您发布的查询可用作 CTE。

所以:

with 
q1 as
  (select ic.ITEM_ID, ic.ITEM_NAME
   from ITEM_CBO ic 
   where COLOR_DESC = 'BRAND'),
q2 as
  (select ptt.ITEM_ID, 
     TO_CHAR(MAX(ptt.CREATE_DATE_TIME), 'dd/mm/yyyy') as last_trans_date
   from PROD_TRKG_TRAN ptt
   where ptt.TRAN_TYPE = 500 
     and ptt.TRAN_CODE = '010' 
     and ptt.MENU_OPTN_NAME = 'LOA Pck Pick Cart'
   group By ptt.ITEM_ID
  ),
q3 as
  (select wi.ITEM_ID, 
     sum(wi.ON_HAND_QTY) as sum_on_hand_qty
   from WM_INVENTORY wi
   where wi.ITEM_ID in (SELECT ic.ITEM_ID 
                        from ITEM_CBO ic 
                        where COLOR_DESC = 'BRAND')
   group by wi.ITEM_ID
  )
-- final query
select a.item_id, a.item_name, b.last_trans_date, c.sum_on_hand_qty
from q1 a left join q2 b on a.item_id = b.item_id
          left join q3 c on c.item_id = a.item_id

推荐阅读