我对 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/