【发布时间】:2017-06-25 07:08:04
【问题描述】:
我需要编写一个查询,用同一表中另一行的值替换其中一个列的值。我尝试使用简单的内部连接,但没有看到我需要的结果。
以下是表 BANK_LOANS 的示例:
MONTH_ID LOAN_NUMBER BANK_NAME AMOUNT
======== =========== ========== ========
76 00-100 Bank One 100.00
75 00-100 The Bank One 150.00
74 00-100 Bank 1 150.00
76 00-200 Another Bank 300.00
75 00-200 Another Bank 500.00
数据是从不验证银行名称的外部来源加载的,因此给定贷款编号的银行名称的拼写可能会有所不同。客户希望数据库中的任何 BANK_NAME 最大 MONTH_ID 用于该 LOAN_NUMBER 的所有结果,并且他们希望结果按 BANK_NAME 排序。例如,贷款 00-100 的所有行都需要一个 BANK_NAME 为“Bank One”。
我尝试使用内部联接来执行此操作,但没有得到正确的结果
SELECT name.BANK_NAME,
bl.LOAN_NUMBER,
bl.AMOUNT
FROM BANK_LOANS
INNER JOIN BANK_LOANS home
ON name.LOAN_NUMBER = bl.LOAN_NUMBER
AND name.MONTH_ID = 67 --the max id provided to the query
ORDER BY name.BANK_NAME, bl.LOAN_NUMBER, bl.MONTH_ID DESC
我认为我可以使用子查询,但它有点难看。我想知道是否有更好的方法(最佳实践)通过连接或其他 oracle 函数来完成此任务。
这似乎可行,但感觉不对:
SELECT name.BANK_NAME,
bl.LOAN_NUMBER,
bl.AMOUNT
FROM BANK_LOANS,
(SELECT bl2.BANK_NAME, bl2.LOAN_NUMBER
FROM BANK_LOANS
WHERE bl2.MONTH_ID = 76 --max month id provided to query
) name
WHERE name.LOAN_NUMBER = bl.LOAN_NUMBER
ORDER BY name.BANK_NAME, bl.LOAN_NUMBER, bl.MONTH_ID DESC
【问题讨论】:
-
任何包含逗号“感觉不对”的
FROM子句。 -
@GordonLinoff - 有少数例外;例如,具有快速刷新功能的物化视图不支持标准连接语法,它们需要旧的 Oracle 语法以及
WHERE子句中的连接条件。只有甲骨文知道为什么。