Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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
具有多个条件的Oracle SQL联接子查询_Sql_Oracle - Fatal编程技术网

具有多个条件的Oracle SQL联接子查询

具有多个条件的Oracle SQL联接子查询,sql,oracle,Sql,Oracle,编辑:在每个代码段下添加示例结果,并在末尾添加所需结果 我已经浏览了好几篇文章,但我似乎找不到一个我能准确应用的解决方案。我有一个表r,其中包含acctnbr和modnbr的数据。对于大多数acctnbr只有一条记录,结果modnbr为1,但如果modnbr为1-5,则最多可以有5条记录 表u没有modnbr,所以我想在acctnbr上做一个左连接,只从表u返回表r中的maxmodnbr的值 这是我的代码,没有尝试加入。我需要在联接中包含其他限定符,如图所示: select r.acctnbr,

编辑:在每个代码段下添加示例结果,并在末尾添加所需结果

我已经浏览了好几篇文章,但我似乎找不到一个我能准确应用的解决方案。我有一个表
r
,其中包含
acctnbr
modnbr
的数据。对于大多数
acctnbr
只有一条记录,结果
modnbr
为1,但如果
modnbr
为1-5,则最多可以有5条记录

u
没有
modnbr
,所以我想在
acctnbr
上做一个左连接,只从表
u
返回表
r
中的max
modnbr
的值

这是我的代码,没有尝试加入。我需要在联接中包含其他限定符,如图所示:

select
r.acctnbr,
r.modnbr,
r.modtypcd,
r.moddate,
u.userfieldcd,
u.value

from loanrestructuretracking r 

LEFT JOIN acctuserfield u on u.acctnbr = r.acctnbr 
and u.userfieldcd = 'LOMO'

order by r.moddate desc
正如所料,无论
modnbr
如何,我都会为每个
r.acctnbr
获得相同的
u.value
。结果如下:

+---------+--------+----------+------------+-------------+-------+
| acctnbr | modnbr | modtypcd |  moddate   | userfieldcd | value |
+---------+--------+----------+------------+-------------+-------+
| 1122330 |      1 | LM       | 1/1/2018   | LOMO        | DLQ   |
| 1223340 |      1 | LM       | 2/5/2018   | LOMO        | DLQ   |
| 2233440 |      1 | LM       | 6/9/2017   | LOMO        | COT   |
| 2233440 |      2 | LM       | 11/20/2017 | LOMO        | COT   |
| 2233440 |      3 | LM       | 3/12/2018  | LOMO        | COT   |
| 3344550 |      1 | LM       | 4/27/2018  | LOMO        | EXT   |
| 3344550 |      2 | LM       | 6/2/2018   | LOMO        | EXT   |
+---------+--------+----------+------------+-------------+-------+
现在,这里是我试图寻找max
modnbr
的代码,但我现在只看到max
modnbr
的任何实例的
u.value
(在我的例子中,5)

下面是上述脚本的结果。请注意,对于具有max
modnbr
的记录,只有一个
u.value

+---------+--------+----------+------------+-------------+-------+
| acctnbr | modnbr | modtypcd |  moddate   | userfieldcd | value |
+---------+--------+----------+------------+-------------+-------+
| 1122330 |      1 | LM       | 1/1/2018   | LOMO        |       |
| 1223340 |      1 | LM       | 2/5/2018   | LOMO        |       |
| 2233440 |      1 | LM       | 6/9/2017   | LOMO        |       |
| 2233440 |      2 | LM       | 11/20/2017 | LOMO        |       |
| 2233440 |      3 | LM       | 3/12/2018  | LOMO        | COT   |
| 3344550 |      1 | LM       | 4/27/2018  | LOMO        |       |
| 3344550 |      2 | LM       | 6/2/2018   | LOMO        |       |
+---------+--------+----------+------------+-------------+-------+
最后,这里是所需的结果-每个
acctnbr
的max
modnbr
的u值,以及该
acctnbr
的非max
modnbr
的任何记录的null值:

+---------+--------+----------+------------+-------------+-------+
| acctnbr | modnbr | modtypcd |  moddate   | userfieldcd | value |
+---------+--------+----------+------------+-------------+-------+
| 1122330 |      1 | LM       | 1/1/2018   | LOMO        | DLQ   |
| 1223340 |      1 | LM       | 2/5/2018   | LOMO        | DLQ   |
| 2233440 |      1 | LM       | 6/9/2017   | LOMO        |       |
| 2233440 |      2 | LM       | 11/20/2017 | LOMO        |       |
| 2233440 |      3 | LM       | 3/12/2018  | LOMO        | COT   |
| 3344550 |      1 | LM       | 4/27/2018  | LOMO        |       |
| 3344550 |      2 | LM       | 6/2/2018   | LOMO        | EXT   |
+---------+--------+----------+------------+-------------+-------+
我需要做什么才能使连接在max
modnbr
per
acctnbr
上工作? 谢谢

我想你想要:

select . . .
from (select r.*, row_number() over (partition by r.acctnbr order by r.modnbr desc) as seqnum
      from loanrestructuretracking r
     ) r left join 
     acctuserfield u
     on u.acctnbr = r.acctnbr and
        u.userfieldcd = 'LOMO'
where seqnum = 1
order by r.moddate desc;
我有:

with base_qry as
(
  select
  r.acctnbr,
  r.modnbr,
  r.modtypcd,
  r.moddate,
  u.userfieldcd,
  u.value,
  max(r.modnbr ) over (partition by r.acctnbr) as max_modnbr

  from loanrestructuretracking r 

  LEFT JOIN acctuserfield u on u.acctnbr = r.acctnbr 
  and u.userfieldcd = 'LOMO'
)
select 
  acctnbr,
  modnbr,
  modtypcd,
  moddate,
  userfieldcd,
  case when modnbr = max_modnbr then value else null end as value
from base_query
order by moddate desc
没有数据,所以不是100%确定,但我认为这会给你你想要的

max(r.modnbr)over(由r.acctnbr分割),因为max_modnbr将每个acctnbr的最大modnbr追加到每一行

然后,case语句将不匹配的行上的值替换为null

可以把整件事写得更简洁一些,如:

select
  r.acctnbr,
  r.modnbr,
  r.modtypcd,
  r.moddate,
  u.userfieldcd,
  case when modnbr = max(r.modnbr ) over (partition by r.acctnbr) 
       then u.value else null end as value

  from loanrestructuretracking r 

  LEFT JOIN acctuserfield u on u.acctnbr = r.acctnbr 
  and u.userfieldcd = 'LOMO'

更新您的问题并添加适当的数据样本。。您的实际结果和预期结果使我无法将一些虚拟数据放在一起,因为我无法共享实际结果results@scaisEdge表LoanStructureTracking和表acctuserfield的更新一致数据也很有用。。如果没有起始数据,我无法理解你是如何得到结果的……如果我能提供更多数据,我会。。。。简而言之,LoanRestructure Tracking的主键是acctnbr和modnbr,而acctuserfield的主键只有acctnbr。Modnbr是顺序的-Modnbr=3比Modnbr=2更新,而acctuserfield中的值是最新Modnbr的值。我只想要每个acctnbr的最新modnbr的值。将最新modnbr的值分配给所有modnbr是不正确的。这在仅返回最大modnbr的记录时有效,但当modnbr不是每个acctnbr.Beautiful的最大值时,我会查找空值-它有效。感谢使用较小的版本进行更新,我的权限级别要求我使用SELECT启动每个查询,因此CTE是不可能的。很高兴提供帮助-分析功能非常有用。
select
  r.acctnbr,
  r.modnbr,
  r.modtypcd,
  r.moddate,
  u.userfieldcd,
  case when modnbr = max(r.modnbr ) over (partition by r.acctnbr) 
       then u.value else null end as value

  from loanrestructuretracking r 

  LEFT JOIN acctuserfield u on u.acctnbr = r.acctnbr 
  and u.userfieldcd = 'LOMO'