sql - oracle sql中的合并查询
问题描述
MERGE INTO temp d
USING (
select lid,cid,eid,tid,eeid from
table where
eid=5) s
ON (d.lid = s.lid and d.cid = s.cid and d.EID = s.EID and d.tid = s.tid and d.eeid = s.eeid)
WHEN NOT MATCHED THEN INSERT (lid, EID,cid, tid, eeid, is_locked)
VALUES (s.lid, s.EID, s.cid, s.tid s.eeid, (select nvl(min(is_locked),0) from (
select ppl.is_locked, ROWNUM RNK
from ppl
where ppl.lid = s.lid and ppl.tid = s.id and ppl.cid = s.cid and ppl.eeid = s.eeid and ppl.eid = s.eid
order by ppl.locked_dt desc
) where RNK = 1 ));
即时写入值的选择查询将 s.eid 和所有其他 s 引用称为无效标识符
任何人都可以提供修复我如何在值部分中使用 S 的方法。
解决方案
您可以提前准备值:
MERGE INTO temp d USING (
select lid,cid,eid,tid,eeid, ppl.is_locked
from table
LATERAL ( select nvl(min(is_locked), 0) is_locked
from ppl
where
ppl.lid = d.lid
and ppl.tid = d.id
and ppl.cid = d.cid
and ppl.eeid = d.eeid
and ppl.eid = d.eid
order by ppl.locked_dt desc
) ppl
where eid = 5) s
ON (d.lid = s.lid and d.cid = s.cid and d.EID = s.EID and d.tid = s.tid and d.eeid = s.eeid)
WHEN NOT MATCHED THEN INSERT (lid, EID, cid, tid, eeid, is_locked)
VALUES (s.lid, s.EID, s.cid, s.tid s.eeid,s.is_locked);
你在子查询中返回第一行然后 min() 没有意义,所以我得到所有记录中的最小值,如果你真的想要第一行,那么你可以相应地更改子查询,但你明白了
推荐阅读
- javascript - 如何通过使用变量映射将缩小的 JavaScript 转换为未缩小的 JavaScript
- javascript - Group Array of objects table 1 嵌套表 2 中的键。 MySql - NodeJS (GET API)
- javascript - 井字游戏中计算机的随机位置选择无法正常工作
- java - 在杰克逊反序列化期间验证 JSON 有效负载时如何抛出异常?
- vue.js - 如何在 Vue 或其他框架中使用 rxjs 自定义 longpress 指令?
- java - 为什么java mail api会抛出异常?
- class - Kotlin:自定义类实例上未解决的引用
- jupyter-notebook - 在不影响彼此会话的情况下运行同一个 jupyter notebook 的多个实例
- c - 如何将嵌套的 c struct 数据保存到磁盘?
- android - 无法使用 Kotlin、Retrofit、RxJava 和 MVVM 模式解析嵌套 JSON