sql - Oracle SQL 多个左连接有重复记录或 "invalid identifier"

标签 sql oracle duplicates left-join

我对 SQL 相当陌生,之前也做过一些连接,但没有像这样复杂的。

基本上,我想做的是将许多表格连接在一起以显示报告的总体数据。主表g是我想查看详细程度的地方。 g 与附加到它的所有表具有一对多关系。 GROUP BY 会消除这些重复项吗?

我尝试过使用SELECT DISTINCT,但我不确定这是否是最佳解决方案。

以下是我当前运行的 SQL 的输出ORA-00904: "a"."akey": 无效标识符

SELECT 
a.afield123 ORDER_QTY,
b.bfield123 MANUF,
c.cfield123 ORDER_DATE,
d.dfield123 PATIENT_CREATE_DATE,
e.efield123 PAYOR_CLASS,
f.ffield123 ID

FROM

schema123.a12345            a,
schema123.b12345            b,
schema123.c12345            c,
schema123.d12345            d,
schema123.e12345            e,
schema123.f12345            f,

LEFT JOIN schema123.g12345  g ON     
(a.akey = b.akey AND
 c.ckey = d.ckey AND 
 e.ekey = f.ekey)

这是一些示例数据

G表(主表) 主键:gfield123 外键:akey,bkey,ckey,dkey,ekey,fkey,hkey

gfield123   gfield124   akey    bkey    ckey    dkey    ekey    fkey   hkey
1           8/1/2017    1234    2234    3234    4234    5234    6234   7234

一张 table 主键:akey 外键:gfield123、bkey

akey    afield123   gfield123   bkey        
1234    20          1           2234        
1235    40          1           2234        

B表 主键:bkey 外键:gfield123、ckey、akey

bkey    bfield123   gfield123 akey  ckey    
2234    COMPANY1    1         1234  3234    

C表 主键:ckey 外键:gfield123、bkey、dkey

ckey    cfield123   gfield123   bkey    dkey    
3234    8/5/2017    1           2234    4234     

D表 主键:dkey 外键:gfield123、ckey、ekey

dkey    dfield123       gfield123   ckey    ekey    
4234    7/1/2017        1           3234    5234    

E表 主键:ekey 外键:gfield123、fkey

ekey    efield123       gfield123   fkey
5234    MEDICARE        1           6234 

F表 主键:fkey 外键:gfield123

fkey    ffield123         gfield123 
6234    ABC123            1         

H表 主键:hkey

hkey    hfield123           
7234    9999                   

预期结果

gfield123   afield123   bfield123 cfield123 efield123 ffield123 hfield123
1           60          COMPANY1  8/5/2017  MEDICARE  ABC123    9999    

编辑:SQL 简化、数据样本、预期结果

最佳答案

如果您想要 G 中的所有记录,并且只想要 a-b-c-d-e-f 中匹配的记录,则

除非发生聚合,否则通常不会使用分组依据。 Distinct 告诉我们您知道表连接中有重复项,并且您希望从结果中消除它们。

SELECT sum(a.afield123) as ORDER_QTY
     , b.bfield123 as MANUF
     , c.cfield123 as ORDER_DATE
     , d.dfield123 as PATIENT_CREATE_DATE
     , e.efield123 as PAYOR_CLASS
     , f.ffield123 as ID
     , g.gfield123 as gkey
     , g.hfield123 as hField123
FROM schema123.g12345 g
LEFT JOIN schema123.a12345 a
  ON g.gkey = a.gkey
LEFT JOIN schema123.b12345 b
  ON a.akey = b.akey
 AND g.gkey = b.gkey
LEFT JOIN schema123.c12345 c
  ON b.bkey = c.bkey
 AND g.gkey = c.gkey
LEFT JOIN schema123.d12345 d
  ON c.ckey = d.ckey
 AND g.gkey = d.gkey
LEFT JOIN schema123.e12345 e
  ON d.dkey = e.dkey
 AND g.gkey = g.gkey
LEFT JOIN schema123.f12345 f
  ON e.ekey = f.ekey
 AND g.gkey = g.gkey
LEFT JOIN schema123.f12345 
  on g.hkey = h.hkey
GROUP BY , b.bfield123 as MANUF
     , c.cfield123 as ORDER_DATE
     , d.dfield123 as PATIENT_CREATE_DATE
     , e.efield123 as PAYOR_CLASS
     , f.ffield123 as ID
     , g.gfield123 as gkey
     , g.hfield123 as hField123

请注意我们

  • 消除了 from 子句中的逗号符号,这是 89 标准。是的,差不多 30 年前,92 分之一的人现在使用左/右,完整的外部语法。
  • 将 g.field123 gkey 添加到选择中,如果不选择任何内容,为什么要加入表?
  • 将 g 移至 from 中的第一个条目(您想要 G 中的所有记录,并且只需要那些在其他表链中匹配的记录,对吗?
  • 为每个连接添加一个左连接和一个 on 子句。
  • 我对齐了代码,以便可以查看 select 中是否缺少 , 。
  • 假设关键符号有意义。
  • 假设加入 g.gkey = a.akey,因为您没有说明 g 与其他表的关系。
  • 如果添加 WHERE 子句,则只能在其中添加对 g 的限制。
  • 如果您需要限制其他表中的值,请在连接本身上使用 AND,例如 and d.dfield123 >= to_date('2017-01-01','YYYY -MM-DD') 因此仅显示 2017 年创建的患者。

关于sql - Oracle SQL 多个左连接有重复记录或 "invalid identifier",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45592952/

相关文章:

Python:以随机顺序删除一对重复的字符串

mysql - 快速 MYSQL 查询删除重复项

C# SQL : How can I increment an integer value in a database by one on multiple records?

sql - 为什么 Oracle 使用 ORDER BY 忽略索引?

sql - Node.js SQL Server 代码似乎有误,但仍然有效?

java - JBoss 和 Oracle 12c : datasource bound successfully but cannot connect

java - 如何使用 SQL 调用以数组作为参数的 pl/SQL 函数

java - 如何避免类的所有方法共有的重复代码?

sql - 为什么要使用“选择前 100%”?

java - 从java类生成sql