【问题标题】:pseudo columns & DUAL table - what do they actually mean?伪列和 DUAL 表 - 它们实际上是什么意思?
【发布时间】:2018-07-31 21:34:04
【问题描述】:

双表用于选择伪列。 它有一行一列 DUMMY,其值为 X。

我有两个问题

  1. 什么是伪 列是什么意思?
  2. 双重如何能够给予 值例如:

    select sysdate from dual
    

    将导致当前日期时间。这怎么可能?

【问题讨论】:

    标签: sql oracle dual-table


    【解决方案1】:

    伪列是返回系统生成值的函数。 sysdate 是一个返回当前日期时间的函数; rownum 是一个伪列,它返回结果集中的行号。

    这个命名法可以追溯到早期的 Oracle,在我们有 PL/SQL 之前。这只是意味着我们可以在 SELECT 语句的投影中使用这些函数,就像表的列一样。现在我们可以编写自己的函数并在 SQL 语句中使用它们而不会眨眼,所以“伪列”这个短语有点令人困惑。

    函数与伪列的区别在于伪列为结果集中的每一行返回不同的值,而函数返回相同的值(除非表作为参数传递以派生值)。

    Dual 是 Oracle 历史上另一个值得尊敬的部分。它是一个包含一行的表,数据库知道包含一行。所以你引用的选择语句只是说“给我当前的日期时间”。它在功能上等同于

    select sysdate 
    from emp
    where rownum = 1
    /
    

    在 PL/SQL 中,从对偶中选择是无效的。我们可以这样编码:

    l_date := sysdate;
    

    DUAL 的一个常见用途是获取触发器中序列的下一个值。从 11g 开始,我们可以做...

    :new.id := my_seq.nextval;
    

    在幕后这仍然执行select my_seq.nextval into :new.id from dual;

    【讨论】:

    • 功能等效 - 除非 emp 为空 :)
    【解决方案2】:

    2。从 DUAL 中选择如何给系统时间?

    SQL 有许多内置函数,它们后面不需要括号来调用它们。 Oracle 中的一个这样的函数是 SYSDATE。

    请记住,如果您有一张表,则没有限制条件(WHERE 子句)的 SELECT 语句通常会为表中的每一行返回一行数据。所以,给定一个表格:

    CREATE TABLE Ex1(Dummy CHAR(10) NOT NULL);
    INSERT INTO Ex1 VALUES('Abacus');
    INSERT INTO Ex1 VALUES('Sedentary');
    INSERT INTO Ex1 VALUES('Caucasus');
    

    运行 SELECT 语句:

    SELECT Dummy FROM Ex1;
    

    将返回 3 行。现在,假设我将语句写为:

    SELECT 'ABC', Dummy, SYSDATE FROM Ex1;
    

    这也将返回 3 行:

    • ABC,算盘,2010-03-03
    • ABC,久坐不动,2010-03-03
    • ABC,高加索,2010-03-03

    如果我省略 Dummy 列:

    SELECT 'ABC', SYSDATE FROM Ex1;
    

    我明白了:

    • ABC, 2010-03-03
    • ABC, 2010-03-03
    • ABC, 2010-03-03

    如果我省略了字符串文字:

    SELECT SYSDATE FROM Ex1;
    

    我明白了:

    • 2010-03-03
    • 2010-03-03
    • 2010-03-03

    我删除两行并重新运行查询,我得到:

    DELETE FROM Ex1 WHERE Dummy > 'B';
    SELECT SYSDATE FROM Ex1;
    

    我明白了:

    • 2010-03-03

    因为 Ex1 表中只有一行数据。

    名义上,我可以这样做:

     UPDATE Ex1 SET Dummy = 'X';
     RENAME TABLE Ex1 AS Dual;
    

    当然,您不能这样做 - 我不确定 Oracle 是否支持 RENAME TABLE 语句,它可能不允许您重命名表,因此它可能与内置的 DUAL 表混淆。但从概念上讲,其中包含单行的表 Ex1 与 DUAL 同构。

    1。什么是伪列?

    除非 Oracle 对该术语有特定的特殊含义,否则伪列是看起来是表的一部分但实际上并未作为数据存储在表中的列。一个经典的例子是行号:

    SELECT ROWNUM, * FROM SomeTable
    

    输出似乎有一个 ROWNUM 列(Informix 中的 ROWID,我最熟悉),但它没有直接存储在 DBMS 中。不同的 DBMS 有其他不同的伪列,用于不同的目的。

    有时很难区分伪列和函数。

    【讨论】:

      【解决方案3】:

      伪列是 Oracle 分配的值(伪字段),但不存储在磁盘上。

      伪列不是表中的实际列,但它们的行为类似于列。

      例如,您可以从伪列中选择值。但是,您不能在伪列中插入、更新或删除。另请注意,SQL 语句中允许使用伪列,但过程语句中不允许使用伪列。

      注意:- SQL 语句中允许使用伪列,但过程语句中不允许使用伪列。

      SQL> SELECT sysdate, systimestamp FROM dual; SYSDATE SYSTIMESTAMP


      13-DEC-07 13-DEC-07 10.02.31.956842 AM +02:00

      【讨论】:

        【解决方案4】:

        伪列:ROWID、ROWNUM、LEVEL

        【讨论】:

        • 伪列是 Oracle 分配的值(伪字段),但不存储在磁盘上。伪列不是表中的实际列,但它们的行为类似于列。伪列:ROWID、ROWNUM、LEVEL、COLUMN_VALUE
        猜你喜欢
        • 1970-01-01
        • 2018-08-08
        • 1970-01-01
        • 1970-01-01
        • 2020-02-15
        • 2021-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多