Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 内部联接是否可以替换列';s值与同一表中的另一个值-对于所有行_Sql_Oracle_Join_Subquery - Fatal编程技术网

Sql 内部联接是否可以替换列';s值与同一表中的另一个值-对于所有行

Sql 内部联接是否可以替换列';s值与同一表中的另一个值-对于所有行,sql,oracle,join,subquery,Sql,Oracle,Join,Subquery,我需要编写一个查询,将该列的一个值替换为同一表中另一行的值。我尝试使用一个简单的内部联接,但没有看到所需的结果 以下是银行贷款表的一个示例: MONTH_ID LOAN_NUMBER BANK_NAME AMOUNT ======== =========== ========== ======== 76 00-100 Bank One 100.00 75 00-100 The

我需要编写一个查询,将该列的一个值替换为同一表中另一行的值。我尝试使用一个简单的内部联接,但没有看到所需的结果

以下是银行贷款表的一个示例:

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
数据是从外部来源加载的,而外部来源不验证银行名称,因此给定贷款号码的银行名称拼写可能会有所不同。客户希望数据库中最大月份ID的任何银行名称都用于该贷款编号的所有结果,并希望结果按银行名称排序。例如,贷款00-100的所有行都需要一个银行名称“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

使用分析函数:

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 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;

任何包含逗号的
FROM
子句“感觉不对劲”。@GordonLinoff-有少数例外;例如,具有refresh fast的物化视图不支持标准联接语法,它们需要在
WHERE
子句中带有联接条件的旧Oracle语法。只有甲骨文知道原因。任何包含逗号的
FROM
子句都“感觉不对”。@GordonLinoff-除了少数例外;例如,具有refresh fast的物化视图不支持标准联接语法,它们需要在
WHERE
子句中带有联接条件的旧Oracle语法。只有Oracle知道原因。错误的分析函数(使用ORDER BY子句时,移动窗口上的最小值)。错误的分析函数(使用ORDER BY子句时,移动窗口上的最小值)。这是聚合函数(没有分区子句),因此解析器将抛出语法错误,因为没有GROUPBY子句。这是一个聚合函数(没有partition子句),所以解析器会抛出一个语法错误,因为没有GROUPBY子句。谢谢@mathguy的帖子!我将研究第一个函数和partition子句,并尝试将其应用到我们的查询中。@Roy-您需要“研究”的是分析函数的一般概念(有时错误地称为窗口函数)。
partition
子句是其中的一个主要概念,
first\u value()
是分析函数之一。好处是它们都以非常相似的方式工作,因此只要花合理的时间学习它们,您就可以一次获得很多工具。祝你好运谢谢@mathguy的帖子!我将研究第一个函数和partition子句,并尝试将其应用到我们的查询中。@Roy-您需要“研究”的是分析函数的一般概念(有时错误地称为窗口函数)。
partition
子句是其中的一个主要概念,
first\u value()
是分析函数之一。好处是它们都以非常相似的方式工作,因此只要花合理的时间学习它们,您就可以一次获得很多工具。祝你好运
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.