![](/img/trans.png)
[英]Replace a string value in a column by values from same column in another table
[英]Can INNER JOIN replace a column's value with another value from the same table - for all rows
我需要編寫一個查詢來將列中的一個值替換為同一個表中另一行的值。 我試圖使用一個簡單的內連接,但我沒有看到我需要的結果。
這是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
with
test_data ( month_id, loan_number, bank_name, amount ) as (
select 76, '00-100', 'Bank One' , 100.00 from dual union all
select 75, '00-100', 'The Bank One', 150.00 from dual union all
select 74, '00-100', 'Bank 1' , 150.00 from dual union all
select 76, '00-200', 'Another Bank', 300.00 from dual union all
select 75, '00-200', 'Another Bank', 500.00 from dual
)
-- end of test data (not part of the solution).
-- SQL query begins BELOW THIS LINE; use with your table.
select month_id, loan_number,
first_value(bank_name)
over (partition by loan_number order by month_id desc) as bank_name,
amount
from test_data
;
MONTH_ID LOAN_N BANK_NAME AMOUNT
-------- ------ ------------ ------
74 00-100 Bank One 150
75 00-100 Bank One 150
76 00-100 Bank One 100
75 00-200 Another Bank 500
76 00-200 Another Bank 300
5 rows selected.
使用分析函數:
select bl.loannumber, bl.amount,
max(bank_name) keep (dense_rank first order by month_id desc) over (partition by loannumber) as bank_name
from bank_loans bl;
SELECT month_id,
loan_number,
MIN(bank_name) over(PARTITION BY loan_number ORDER BY month_id DESC),
amount
FROM bank_loans;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.