plsql-Oracle选择集合
我有两个数字集合,一个包含n个ID,另一个包含n个值。我还有一个包含n条记录的select语句。现在,我想把他们连在一起。 直觉上,我试着这样做: 我想添加集合中相应的id和值,以查看表中的值行与集合中的值行是否不同,然后返回名称 因此,结果如下所示:plsql-Oracle选择集合,oracle,plsql,Oracle,Plsql,我有两个数字集合,一个包含n个ID,另一个包含n个值。我还有一个包含n条记录的select语句。现在,我想把他们连在一起。 直觉上,我试着这样做: 我想添加集合中相应的id和值,以查看表中的值行与集合中的值行是否不同,然后返回名称 因此,结果如下所示: ID VALUE NAME 98 1 some varchar 153 1 some varchar 66 1 some varchar 27 3 some var
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 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和值来自表,后一个id和值列来自集合
因此,结尾的where子句:
and status.StatValue <> statusNew.StatValue
将给我更改值的记录,返回第4-7行
现在,在我看来,这看起来有点难看。特别是where子句,我在其中检查rownum。不管怎样,我对Oracle还是比较陌生的,这有什么不好的地方吗?或者有更好的方法来实现这一点吗?因为您有两个独立的数字集合中的匹配信息和比较数据,所以同步这两个列表的唯一方法是按位置,这里是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和value的集合中。
但是如果你必须经常做这样的工作,你可以考虑,如果花时间来创建这样一个函数,那就值得了。你能发布原始数据结构和预期结果吗?对不起,我编辑了我的帖子
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 ...