plsql-Oracle选择集合

我有两个数字集合,一个包含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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

PLSQL Oracle-帮助建立选择

来自分类Dev

选择存储的proc plsql

来自分类Dev

从Oracle运行.py(plsql)

来自分类Dev

Oracle PLSQL案例声明

来自分类Dev

带来很多年(oracle plsql)

来自分类Dev

Oracle plsql对象成员函数

来自分类Dev

Oracle PLSQL异常插入日期

来自分类Dev

Oracle PLSQL 中的 LOB 操作

来自分类Dev

PLSQL ORACLE Not Working 返回错误

来自分类Dev

plsql记录类型和记录类型的集合

来自分类Dev

集合在PLSQL中不起作用

来自分类Dev

从plsql选择过程中检索值

来自分类Dev

从plsql选择过程中检索值

来自分类Dev

PLSQL:返回任意选择列的函数

来自分类Dev

Oracle PLSQL BULK收集和循环

来自分类Dev

如何遍历Oracle PLSQL中的分隔列表

来自分类Dev

ORACLE PLSQL IF ELSEIF ELSE无法正常工作

来自分类Dev

将数字转换为天oracle plsql

来自分类Dev

在where子句中连接并使用oracle plsql

来自分类Dev

在Oracle plsql中备份软件包

来自分类Dev

Oracle PLSQL重现模式RFC 2445

来自分类Dev

如何在Oracle PLSQL中透视表?

来自分类Dev

编写PLSQL Oracle函数以查询表

来自分类Dev

在where子句中连接并使用oracle plsql

来自分类Dev

在Oracle plsql中备份软件包

来自分类Dev

从PLSQL处理Oracle Apex上的动态值

来自分类Dev

Oracle PLSQL依赖关系链(无效对象)

来自分类Dev

从 oracle db 填充 plsql 中的 poplist

来自分类Dev

过程中的 PLSQL Oracle 游标