plsql - 带有集合的 Oracle 选择
Posted
技术标签:
【中文标题】plsql - 带有集合的 Oracle 选择【英文标题】:plsql - Oracle select with collections 【发布时间】:2016-03-23 08:04:02 【问题描述】:我有两个数字集合,一个包含 n 个 id,一个包含 n 个值。我还有一个包含 n 条记录的选择语句。现在,我想和他们一起。 直觉上我试图做这样的事情:
select * from
(
select t.stat StatNr
, t.statNr StatValue
, t.statName statusName
from myTable t
where t.nr = 1234
order by ...
) status,
(
select statId.v StatNr
, statVal.v StatValue
from
(
select column_value v
, rownum r
from table( numberCollection( 98, 45, 66, 153, 103, 67, 27 ) )
) statId,
(
select column_value v
, rownum r
from table( numberCollection( 1, 2, 1, 1, 3, 2, 2 ) )
) statVal
where statId.r = statVal.r
) statusNew
where status.StatNr = statusNew.StatNr
and status.StatValue <> statusNew.StatValue
所以,没有数字集合的 select 语句返回如下内容:
ID VALUE NAME
98 1 some varchar
153 1 some varchar
66 1 some varchar
27 3 some varchar
67 4 some varchar
45 1 some varchar
103 1 some varchar
我想从我的集合中添加相应的 id 和值,以查看我的表中的值行是否与我的集合中的值行不同,然后返回名称。
所以,结果如下所示:
ID VALUE NAME ID VALUE
98 1 some varchar 98 1
153 1 some varchar 153 1
66 1 some varchar 66 1
27 3 some varchar 27 2
67 4 some varchar 67 2
45 1 some varchar 45 2
103 1 some varchar 103 3
前一个 id 和 value 来自表,后一个 id 和 value 列来自集合。
所以最后的where子句:
and status.StatValue <> statusNew.StatValue
会给我改变值的记录,返回第 4 - 7 行。
现在,从我的角度来看,这看起来有点难看。特别是我检查rownum的where子句。无论如何,我对 Oracle 还是比较陌生,这有什么缺点或更好的方法来完成这个吗?
【问题讨论】:
join them together
是什么意思。能否贴出原始数据结构和预期结果
是的,抱歉,我编辑了我的帖子
【参考方案1】:
因为您将匹配信息和比较数据放在两个独立的 numberCollections 中,所以同步这两个列表的唯一方法是按位置,这里是 ROWNUM。
但是您可以使用 WITH 子句使您的 SQL 更具可读性:
WITH comparedata AS (
SELECT statid.v StatNr, statval.v StatValue
FROM (
select column_value v
, rownum r
from table( numberCollection( 98, 45, 66, 153, 103, 67, 27 ) )
) statId,
(
select column_value v
, rownum r
from table( numberCollection( 1, 2, 1, 1, 3, 2, 2 ) )
) statVal
where statId.r = statVal.r
)
select t.statNr
, t.statValue
, t.statName
from myTable t
JOIN comparedata d ON d.StatNr ON t.StatNr
where t.nr = 1234
and status.StatValue <> statusNew.StatValue
order by ...
在这里,您使用映射的 numberCollections 的结果定义了一个名为“comparedata”的命名子查询。 在此之后,您可以将“comparedata”用作 JOIN 子句中的任何视图或表与您的真实表。
实现目标的其他方法最终会产生更多代码(例如例程,它将格式为“id=value;[id=value;...]”的字符串拆分为具有两列 ID 和价值。 但是,如果您必须更频繁地执行此类工作,您可能会考虑是否值得花时间创建这样的功能。
【讨论】:
以上是关于plsql - 带有集合的 Oracle 选择的主要内容,如果未能解决你的问题,请参考以下文章