【问题标题】:Right Left Join, does it work on sub-queries oracleRight Left Join,它是否适用于子查询oracle
【发布时间】:2015-06-18 11:22:50
【问题描述】:

我有两张表如下:

loy_credits_ledger

+-----------------+------------------+--------- -----+-----------------+
| CRL_OUTLET_CODE | CRL_REDEEM_MONTH | crl_redeem_year | CRL_RM_REDEEMED |
+-----------------+------+------------ -----+-----------------+
| 144000581 |四月 | 2014 | 273.3 |
| 144000581 |七月 | 2014 | 194.1 |
| 144000581 |华侨城 | 2014 | 216.3 |
| 144000581 |一月 | 2015 | 24.9 |
| 144000581 |一月 | 2015 | 177.1 |
+-----------------+------+------------ -----+-----------------+

jti_qtr_credit_data

+------+----------+-------------+--- ---------+------------+----------+
| QCD_OUTLET_CODE | QCD_YEAR | QCD_季度 | QCD_CREDIT | QCD_POINTS | QCD_CREDITS_BALANCE |
+-----------------+----------+-------------+------ ------+------------+----------+
| 144000581 | 2014 |第一季度 | 273.3 | 54660 | 0 |
| 144000581 | 2014 | Q2 | 194.1 | 38820 | 0 |
| 144000581 | 2014 |第三季度 | 378.8 | 75760 | 0 |
| 144000581 | 2014 |第四季度 | 202 | 40400 | 0 |
| 144000581 | 2015 |第一季度 | 321.55 | 64310 | 0 |
+-----------------+----------+-------------+------ ------+------------+----------+

我需要在某些条件下加入这两个表。除了凌乱的表格结构(我无法控制)之外,我设法让我的结果几乎正确。基本上,这是我的目标:

+------+----------+-------------+--- ---------+------------+--------------+------------ ---------+
| QCD_OUTLET_CODE | QCD_YEAR | QCD_季度 | QCD_POINTS | QCD_CREDIT | QCD_REDEEMED | QCD_CREDITS_BALANCE |
+-----------------+----------+-------------+------ ------+------------+--------------+--------------- ------+
| 144000581 | 2014 | Q2 | 38820 | 194.1 | 194.1 | 0 |
| 144000581 | 2014 |第四季度 | 40400 | 202 | 202 | 0 |
| 144000581 | 2014 |第一季度 | 54660 | 273.3 | 273.3 | 0 |
| 144000581 | 2014 |第三季度 | 75760 | 378.8 | 216.3 | 162.5 |
+-----------------+----------+-------------+------ ------+------------+--------------+--------------- ------+

只是缺少第五条记录,仅存在于jti_qtr_credit_data中。

我使用脚本做到了:

SELECT Q.QCD_OUTLET_CODE,  Q.QCD_YEAR, Q.QCD_QUARTER, Q.QCD_POINTS, Q.QCD_CREDIT,   nvl(SUM(L.REDEEMED), 0) AS QCD_REDEEMED, Q.QCD_CREDIT - NVL(SUM(L.REDEEMED),0) AS QCD_CREDITS_BALANCE
FROM 
(SELECT 
(case when CRL_REDEEM_MONTH = 'JAN' Then 'Q4'
              when CRL_REDEEM_MONTH = 'FEB' Then 'Q4'
              when CRL_REDEEM_MONTH = 'MAR' Then 'Q4'
              when CRL_REDEEM_MONTH = 'APR' Then 'Q1'
              when CRL_REDEEM_MONTH = 'MAY' Then 'Q1'
              when CRL_REDEEM_MONTH = 'JUN' Then 'Q1'
              when CRL_REDEEM_MONTH = 'JUL' Then 'Q2'
              when CRL_REDEEM_MONTH = 'AUG' Then 'Q2'
              when CRL_REDEEM_MONTH = 'SEP' Then 'Q2'
              when CRL_REDEEM_MONTH = 'OCT' Then 'Q3'
              when CRL_REDEEM_MONTH = 'NOV' Then 'Q3'
              when CRL_REDEEM_MONTH = 'DEC' Then 'Q3'
              ELSE NULL END) QUARTER, 

              (case 
              when CRL_REDEEM_MONTH = 'JAN' Then crl_redeem_year-1
              when CRL_REDEEM_MONTH = 'FEB' Then crl_redeem_year-1
              when CRL_REDEEM_MONTH = 'MAR' Then crl_redeem_year-1
              when CRL_REDEEM_MONTH = 'APR' Then crl_redeem_year
              when CRL_REDEEM_MONTH = 'MAY' Then crl_redeem_year
              when CRL_REDEEM_MONTH = 'JUN' Then crl_redeem_year
              when CRL_REDEEM_MONTH = 'JUL' Then crl_redeem_year
              when CRL_REDEEM_MONTH = 'AUG' Then crl_redeem_year
              when CRL_REDEEM_MONTH = 'SEP' Then crl_redeem_year
              when CRL_REDEEM_MONTH = 'OCT' Then crl_redeem_year
              when CRL_REDEEM_MONTH = 'NOV' Then crl_redeem_year
              when CRL_REDEEM_MONTH = 'DEC' Then crl_redeem_year
              ELSE NULL END) redeem_year,

              CRL_OUTLET_CODE,  CRL_CREDITS_EARNED, NVL(CRL_RM_REDEEMED, 0) REDEEMED
FROM loy_credits_ledger
where TO_CHAR(crl_redeem_year) is not null
AND CRL_OUTLET_CODE = 144000581
--GROUP BY CRL_REDEEM_MONTH, crl_redeem_year, CRL_OUTLET_CODE, CRL_CREDITS_EARNED
) L
full outer JOIN jti_qtr_credit_data Q 
ON L.CRL_OUTLET_CODE = Q.QCD_OUTLET_CODE
AND L.redeem_year = Q.QCD_YEAR
AND L.QUARTER =  Q.QCD_QUARTER
AND L.CRL_OUTLET_CODE = 144000581
GROUP BY Q.QCD_OUTLET_CODE,  Q.QCD_YEAR, Q.QCD_QUARTER, Q.QCD_YEAR, Q.QCD_CREDIT, Q.QCD_POINTS;

现在,问题是,我尝试了 leftright 加入。因为我在 jti_qtr_credit_data 中有 QCD_Quarter = Q1 & QCD_Year = 2015 的记录,但在 loy_credits_ledger 中没有;不应该仍然显示带有左或右连接的空值的记录?

这个问题和join的子查询有关系吗?

【问题讨论】:

  • 当 OUTER JOIN 时,(通常)所有条件都应该在 ON 子句中,而不是在 WHERE 子句中。
  • @jarlh 如果你指的是WHERE CRL_OUTLET_CODE = 144000581,我添加了这个来测试一个研究案例。我在每个表中有数百条记录
  • 是的,那个,把它放在ON子句里! (在 WHERE 中,该连接作为常规内部连接执行。)
  • @jarlh 我更新了我的脚本。谢谢,我不知道。但仍然给我同样的结果

标签: sql join oracle11g subquery


【解决方案1】:

通过在正常的WHERE条件中使用(+)符号来告诉数据库包含所有具有NULL值的不匹配行;我设法得到了想要的结果。

修改后的脚本如下:

SELECT Q.QCD_OUTLET_CODE,  Q.QCD_YEAR, Q.QCD_QUARTER, Q.QCD_POINTS, Q.QCD_CREDIT,   nvl(SUM(L.REDEEMED), 0) AS QCD_REDEEMED, Q.QCD_CREDIT - NVL(SUM(L.REDEEMED),0) AS QCD_CREDITS_BALANCE
FROM 
(SELECT 
(case when CRL_REDEEM_MONTH = 'JAN' Then 'Q4'
              when CRL_REDEEM_MONTH = 'FEB' Then 'Q4'
              when CRL_REDEEM_MONTH = 'MAR' Then 'Q4'
              when CRL_REDEEM_MONTH = 'APR' Then 'Q1'
              when CRL_REDEEM_MONTH = 'MAY' Then 'Q1'
              when CRL_REDEEM_MONTH = 'JUN' Then 'Q1'
              when CRL_REDEEM_MONTH = 'JUL' Then 'Q2'
              when CRL_REDEEM_MONTH = 'AUG' Then 'Q2'
              when CRL_REDEEM_MONTH = 'SEP' Then 'Q2'
              when CRL_REDEEM_MONTH = 'OCT' Then 'Q3'
              when CRL_REDEEM_MONTH = 'NOV' Then 'Q3'
              when CRL_REDEEM_MONTH = 'DEC' Then 'Q3'
              ELSE NULL END) QUARTER, 

              (case 
              when CRL_REDEEM_MONTH = 'JAN' Then crl_redeem_year-1
              when CRL_REDEEM_MONTH = 'FEB' Then crl_redeem_year-1
              when CRL_REDEEM_MONTH = 'MAR' Then crl_redeem_year-1
              when CRL_REDEEM_MONTH = 'APR' Then crl_redeem_year
              when CRL_REDEEM_MONTH = 'MAY' Then crl_redeem_year
              when CRL_REDEEM_MONTH = 'JUN' Then crl_redeem_year
              when CRL_REDEEM_MONTH = 'JUL' Then crl_redeem_year
              when CRL_REDEEM_MONTH = 'AUG' Then crl_redeem_year
              when CRL_REDEEM_MONTH = 'SEP' Then crl_redeem_year
              when CRL_REDEEM_MONTH = 'OCT' Then crl_redeem_year
              when CRL_REDEEM_MONTH = 'NOV' Then crl_redeem_year
              when CRL_REDEEM_MONTH = 'DEC' Then crl_redeem_year
              ELSE NULL END) redeem_year,

              CRL_OUTLET_CODE,  CRL_CREDITS_EARNED, NVL(CRL_RM_REDEEMED, 0) REDEEMED
FROM loy_credits_ledger
where TO_CHAR(crl_redeem_year) is not null
AND CRL_OUTLET_CODE = 144000581
--GROUP BY CRL_REDEEM_MONTH, crl_redeem_year, CRL_OUTLET_CODE, CRL_CREDITS_EARNED
) L
    ,
jti_qtr_credit_data q
where L.CRL_OUTLET_CODE(+) = Q.QCD_OUTLET_CODE
AND L.redeem_year(+) = Q.QCD_YEAR
AND L.QUARTER(+) =  Q.QCD_QUARTER
and q.QCD_OUTLET_CODE = 144000581
    GROUP BY Q.QCD_OUTLET_CODE,  Q.QCD_YEAR, Q.QCD_QUARTER, Q.QCD_YEAR, Q.QCD_CREDIT, Q.QCD_POINTS;

结果

+------+----------+-------------+--- ---------+------------+--------------+------------ ---------+
| QCD_OUTLET_CODE | QCD_YEAR | QCD_季度 | QCD_POINTS | QCD_CREDIT | QCD_REDEEMED | QCD_CREDITS_BALANCE |
+-----------------+----------+-------------+------ ------+------------+--------------+--------------- ------+
| 144000581 | 2014 | Q2 | 38820 | 194.1 | 194.1 | 0 |
| 144000581 | 2014 |第四季度 | 40400 | 202 | 202 | 0 |
| 144000581 | 2014 |第一季度 | 54660 | 273.3 | 273.3 | 0 |
| 144000581 | 2014 |第三季度 | 75760 | 378.8 | 216.3 | 162.5 |
| 144000581 | 2015 |第一季度 | 64310 | 321.55 | 0 | 321.55 |
+-----------------+----------+-------------+------ ------+------------+--------------+--------------- ------+

此方法的灵感来自thisthis 文章。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    相关资源
    最近更新 更多