【发布时间】:2021-01-12 06:05:06
【问题描述】:
所有,我想从这个查询中得到可靠的结果:
SELECT ..
FROM
(
SELECT
CO_CODE,
REP.cua cua,
PRD.PRODUCT_DESC,
REGEXP_EXTRACT(B.rfbbn,'^(?:[^*]*\\*){2}([^*]*)',1) cllt,
NVL(CCY_bbce,0) bbce,
B.TYPE,
A.conn_keyy
FROM
(
SELECT conn_keyy , ext_date FROM
(tablee.aa) A
)aaxyz
WHERE flag = 'Y'
)A
LEFT OUTER JOIN
tablee.B
ON A.conn_keyy = B.conn_keyy
LEFT OUTER JOIN (SELECT DISTINCT * FROM tablee.cc) CPLCUR
ON CPLCUR.conn_keyy = A.conn_keyy
AND CPLCUR.cllt = REGEXP_EXTRACT(B.rfbbn,'^(?:[^*]*\\*){2}([^*]*)',1)
AND CPLCUR.dtdt = '1999'
LEFT OUTER JOIN (SELECT DISTINCT * FROM tablee.dd) CPLBAL
ON CPLBAL.conn_keyy = A.conn_keyy
AND CPLBAL.SEQUENCE = CPLCUR.SEQUENCE
AND CPLBAL.dtdt = '1999'
LEFT OUTER JOIN (SELECT DISTINCT * FROM tablee.ee) CPLCCY
ON CPLCCY.conn_keyy = A.conn_keyy
AND CPLCCY.SEQUENCE = CPLCUR.SEQUENCE
AND CPLCCY.dtdt = '1999'
LEFT OUTER JOIN (SELECT DISTINCT * FROM tablee.ff) CPLMOV
ON CPLMOV.conn_keyy = A.conn_keyy
AND CPLMOV.SEQUENCE = CPLCUR.SEQUENCE
AND CPLMOV.dtdt = '1999'
LEFT OUTER JOIN
(tablee.REP)REP
ON REP.relino = B.lnido
LEFT OUTER JOIN tablee.P PRD
ON PRD.PRODUCT_CODE = REGEXP_EXTRACT(A.conn_keyy,'[.]([^.]+)',1)
AND PRD.dtdt = '1999'
WHERE B.lnido LIKE 'PLCONS1%'
) rrvv;
fyi,A 的选择计数 (*) 约为 60,000
我只是想知道为什么我的查询结果变成了 15 亿.. 我错过了什么?我操作左外连接时出了什么问题?
【问题讨论】:
-
首先,表 B 上的 LEFT JOIN 并不是真正的 LEFT JOIN,但它是 INNER JOIN,因为您在 WHERE 子句中使用了
B.lnido LIKE 'PLCONS1%'。接下来,尝试逐个删除 LEFT JOIN 以检查行数是否减少,因为似乎有一对多的关系在结果记录中相乘。 -
如果我可能会问,它应该在这样的情况下产生多少列?仅供参考,当我从 B 中选择计数 (*) 时,结果约为 350,000。或者我应该指定不同的列? sqlandhadoop.com/hive-distinct
-
请按照我在我的第一条评论here 中所说的去做,包括将您的代码剪切和简化为第一个不返回您期望的子表达式并说出您期望的内容以及您期望的原因,并说明理由根据权威文档。 left join minimal reproducible example 否则,您只是要求编写另一本带有定制教程的手册,而没有任何关于您的误解所在的线索。 PS请合理格式化您的代码。 PS你的问题被固定后将是一个很容易找到的常见问题解答。