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 选择的主要内容,如果未能解决你的问题,请参考以下文章

plsql:从选择中插入多行并忽略重复项

Oracle(安装PLSQL注册配置环境变量)

如何从从 plsql 函数 ORACLE 返回的游标中进行选择

Oracle PLSQL - 选择具有最大值的行

plsql developer使用教程

在 Oracle PLSQL 中此选择存在问题