我有两个数字集合,一个包含n个id,一个包含n个值。我也有一个包含n条记录的select语句。现在,我想加入他们的行列。凭直觉,我试图做这样的事情:
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还是比较陌生的,这是不利的还是实现这一目标的更好方法?
因为您的匹配信息和比较数据位于两个独立的numberCollection中,所以同步这两个列表的唯一方法是按位置,这里是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 ...
在这里,您将定义一个名为“ comparedata”的子查询,并带有映射的numberCollections的结果。之后,将“比较数据”用作真实表中JOIN子句中的任何视图或表。
其他实现目标的方法将最终产生更多代码(例如例程,该例程将“ id = value; [id = value; ...]”格式的字符串拆分为具有两列ID和VALUE的集合。)如果您必须更频繁地执行此类工作,则可以考虑是否值得花时间来创建这样的功能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句