【问题标题】:Column ambiguously defined but join properly aliased列定义不明确但正确连接别名
【发布时间】:2018-09-14 16:34:12
【问题描述】:

但是,我有一列定义错误。我已经为所有列正确别名。我想做的就是从名为 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
;

【问题讨论】:

  • 只限定查询中的所有列名。当您有不止一张桌子时,您应该始终这样做。
  • I have properly aliased all columns.- 我在这里看不到任何别名:select primary_ext_mid , mer_dba_nam , clg_num , ent_num , ent_nam , mer_opn_ .............. SELECT 子句中的某些列来自 2 个或更多表,所以 Oracle 抱怨,因为它不知道是哪一个应该使用。

标签: sql oracle join where-clause


【解决方案1】:

曾几何时,在很远的一个数据库中,有两张桌子互相喜欢。他们每天都在做桌子做的事——他们只是躺在那里。

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

create table table2(
   id2 varchar2(10)  
);

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

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

几年过去了,我们的餐桌很开心。现在,在每个童话故事中都必须有一个顾问恶棍,而这个也不例外。一个邪恶的怪物来到镇上,试图说服 table2 使用称为非规范化的强大黑魔法来寻找自己的真相。

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);

当单一真理的承诺不再奏效时,人们正在大量倒下和死亡。

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

Table2 立即后悔没有与 table1 讨论这个问题,在与 King 会面后,他们设法通过在查询中使用完全限定的列名来解决问题。后来他们通过了一项法律,对单表查询强制执行表别名和完全限定列甚至

select t1.id1
      ,t2.id2
      ,t1.truth   -- Specifically from table1
  from table1 t1
  join table2 t2 on(t1.id1 = t2.id2);

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

【讨论】:

    【解决方案2】:

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

    为表名起别名

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 2014-02-08
      • 2014-02-25
      • 1970-01-01
      • 2011-11-07
      • 2019-04-23
      相关资源
      最近更新 更多