列模糊定义但正确连接别名

时间:2018-04-05 00:36:06

标签: sql oracle join where-clause

但是我有一个非常明确的列错误。我已正确别名所有列。我想做的就是从名为fdsna.t_mer_dim_na的表中引入avg_tkt_amt。它可以使用primary_mer_num连接到第一个表。我不知道为什么我会一直收到这个错误。

SELECT
primary_ext_mid
, mer_dba_nam
, clg_num
, ent_num
, ent_nam
, mer_opn_dte
, CASE 
    WHEN mer_cls_dte > sysdate+30 
        THEN null 
    ELSE 
        mer_cls_dte 
    END mer_cls_dte
--, compliant_environment
--, certified_date
, MAX(lst_dep_dte) lst_dep_dte
, MIN(first_dep_dte) first_dep_dte
, CASE 
    WHEN period_date BETWEEN '1-jan-2018' AND '31-jan-2018' 
        THEN SUM(grss_vol) 
    ELSE 
        null 
    END jan_gross_vol
, CASE 
    WHEN period_date BETWEEN '1-feb-2018' AND '28-feb-2018' 
        THEN SUM(grss_vol) 
    ELSE 
        null 
    END feb_gross_vol
, CASE 
    WHEN period_date BETWEEN '1-mar-2018' AND '28-mar-2018' 
        THEN SUM(grss_vol) 
    ELSE 
        null 
    END mar_gross_vol
, SUM(grss_vol) AS gross_volume
--, avg_tkt_amt 
, SUM (DIAOE-equip_rev_amt) AS DIAO
, SUM(dia) AS DIA
,SUM(diaoe) AS DIAOE
,SUM(AMEX_ACQUIRED_TRN_DB_cnt - AMEX_ACQUIRED_TRN_CR_cnt + DEBIT_CARD_TRN_DB_cnt - DEBIT_CARD_TRN_CR_cnt + DISCOVER_ACQUIRED_TRN_DB_cnt - DISCOVER_ACQUIRED_TRN_CR_cnt + VISA_MC_ACQUIRED_TRN_DB_cnt - VISA_MC_ACQUIRED_TRN_CR_cnt) AS nettrncnt
,SUM(OTHER_INCOME_TRN_DB_cnt - OTHER_INCOME_TRN_CR_cnt) AS nettrncnt_other
,SUM(CASH_ADVANCE_TRN_DB_cnt - CASH_ADVANCE_TRN_CR_cnt) AS nettrncnt_cash
FROM bi.t_mer_dim_na a,
     stratus.T_SETT_NA b,
     bi.t_mer_bill_mth_na c,
     FDSNA.T_MER_DIM_NA d,
     (SELECT b.mid,a.compliant_environment,a.certified_date
      FROM eclipse.compliance_info a,eclipse.merch_mid b
      WHERE a.ecl_mid_tag=b.ecl_mid_tag 
     ) f
WHERE a.mid_tag = b.mid_tag
AND clg_num = 7
AND a.mer_dim_id = c.mer_dim_id
AND period_date >= to_date('01012018','mmddyyyy')
AND f.mid(+) = primary_ext_mid
--AND e.mid = primary_ext_mid 
AND d.external_mid = primary_mer_num
AND ent_num in ('45810','45811','46849','45948','45824','46911','45509','46845')
GROUP BY primary_ext_mid, mer_dba_nam,  clg_num, ent_num, mer_opn_dte, ent_nam, 
CASE 
   WHEN mer_cls_dte > sysdate+30 
        THEN null 
    ELSE 
        mer_cls_dte 
    END 
,period_date 
--) sq1

--left join FDSNA.T_MER_DIM_NA b
--on sq1.primary_ext_mid = b.primary_ext_mid
;

2 个答案:

答案 0 :(得分:1)

很久以前,在远离数据库的地方,有两张桌子互相幻想。他们花了很多时间做桌子 - 他们只是躺在那里。

=subtotal(109;B2:B999)

有一天,一个闪亮的SQL查询出现了,并问我们的表是否想要加入搜索真相。他们高兴地同意了,他们找到了生命,宇宙和一切的答案。

create table table1(
   id1   varchar2(10)
  ,truth number
);

create table table2(
   id2 varchar2(10)  
);
几年过去了,我们的桌子很开心。现在,在每个童话故事中都必须有一个顾问恶棍,这一点也不例外。一个邪恶的怪物来到城里并试图说服table2使用强大的黑魔法称为非规范化来搜寻自己的真相。

select id1     -- Only in table1
      ,id2     -- Only in table2
      ,truth   -- Only in table1
  from table1
  join table2 on(id1 = id2);

ID1          ID2               TRUTH
------------ ------------ ----------
A            A                    42

因为在这个数据库中只有一个真理的空间,所以在承诺的土地上,地狱一下子就松了一口气。

alter table table2 add truth number;

当一个单一真理的承诺不再奏效时,人们正在堕落并大量死亡。

select id1     -- Only in table1
      ,id2     -- Only in table2
      ,truth   -- OUCH! So many truths! who to trust? 
  from table1
  join table2 on(id1 = id2);

表2立即感到遗憾的是没有与table1讨论这个问题,在与King的观众讨论之后,他们设法通过在查询中使用完全限定的列名来解决问题。之后他们通过了一项法律来强制执行表别名和完全限定的列甚至以进行单表查询!

,truth
 *****
ERROR at line 3:
ORA-00918: column ambiguously defined

故事的道德:始终使用表别名和完全限定的列名。无论如何你最终都会这样做。这只是时间问题。

答案 1 :(得分:0)

您可能在两个表中都有相同名称的列。这就是显示错误的原因。使用

将表名别名