oracle PLSQL 查询语句select t.*, t.rowid from PU.YK t

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle PLSQL 查询语句select t.*, t.rowid from PU.YK t相关的知识,希望对你有一定的参考价值。

1、这语句是什么意思,请整句给个解释,谢谢。
2、这样的语句查出来后为什么不能像SQL那样直接修改,如果需要修改的话应该怎么做。
请给答案,不要像一楼那样灌水。

1, t.* 表示查询表t 所有字段
t.rowid 表示唯一标识t表中伪列
PU.YK 表示的是用户PU下的YK表
PU.YK t 表示的是t是YK这个表的别名(也就是另外一个简化的名字,可以随意写)
整个语句的意思也就是查询PU用户下YK表的所有记录信息,以及每条记录对应的ROWID信息
2,
在plsql里面独特的rowid(也就是上面提到的伪劣),在sql中不支持。所以就没有办法修改了,但是如果要修改的话。可以直接去原本修改。比如直接在YK表中修改。

select * from pu.yk;
然后相应的修改YK这张表里面的东西就可以了。

如果还有不会可以的再问我哦 。嘿嘿
哈哈哈
参考技术A 解释如下
t.* -----表示查询表t 所有字段
t.rowid---表示唯一标识t表中的物理位置字段(伪列),这个字段是每个表中都默认有的,当设计表时没有设置主键或唯一标实的时候,也可吧他动作表的唯一标示(删除重复数据可用到)
PU.YK---表示查询的是用户名为PU下的YK表,如果是以PU用户登陆的数据库,PU也可以省略
t---PU.YK 表的别名,用于书写的时候方便简单,与PU.YK 完全相同,只是名字不同而已,就行你的学名和你的小名一样。
整个语句的意思也很简单,就是查询PU用户下YK表的所有记录信息,以及每条记录对应的ROWID信息

rowid是oracle特有的,sqlserver不支持,sqlserver可设置自增字段或唯一标识列代替
参考技术B PU应该是用户名,PU.YK就是PU用户下的YK表;
最后的t是别名,代替PU.YK;
t.*是指PU用户下的YK表中满足条件的所有数据;
t.rowid是每条数据对应的物理地址的id;
语句含义为:查询PU用户下的YK表的全部数据及每条数据对应的rowid
参考技术C 第一个问题已经回答的很清楚了,我来说一下第二个问题。
1、问题中给出的语句是查出记录后可以直接修改的,语句本身没有问题。
2、问题出在你登入的用户对PU用户YK表有没有增删改权限。
解决方法:1、直接以PU用户登入,然后进行上述处理。
2、为你登入的用户授予PU用户YK表增删改权限。
参考技术D 1查询PU用户下的YK表中的所有列信息,并且增加了一列伪列
2因为伪列是数据库中实际不存在的所以没有办法进行修改 只能修改数据库中其他实际存在的列

plsql - 带有集合的 Oracle 选择

【中文标题】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 和价值。 但是,如果您必须更频繁地执行此类工作,您可能会考虑是否值得花时间创建这样的功能。

【讨论】:

以上是关于oracle PLSQL 查询语句select t.*, t.rowid from PU.YK t的主要内容,如果未能解决你的问题,请参考以下文章

如何查询oracle 数据库性能,sql资源占用

plsql - 带有集合的 Oracle 选择

oracle查询未释放连接的sql

plsql oracle 使用教程

PLSQL连接Oracle使用like模糊查询中文时返回结果为空

怎么查询oracle中响应时间最长的sql语句,并列出平均响应时间