plsql-Oracle选择集合

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

我有两个数字集合,一个包含n个ID,另一个包含n个值。我还有一个包含n条记录的select语句。现在,我想把他们连在一起。 直觉上,我试着这样做:

我想添加集合中相应的id和值,以查看表中的值行与集合中的值行是否不同,然后返回名称

因此,结果如下所示:

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 ...