如何在sql select query中显示包含值的新列?

时间:2017-04-13 18:33:53

标签: sql oracle

表格中没有主键。

我的表就像

col0   col1   col2   col3
rox    12     34     35
max    56     34     35
bill   13     56     35
rox    56     34     35
sam    12     56     34

我想要一个显示如下额外列的查询:

adb uninstall <package name>

2 个答案:

答案 0 :(得分:0)

添加新列

alter table your_table
     add col0 varchar2(10);
  

“表格中没有主键。”

这意味着col0中的值与现有列之间的关系基本上是随机的,这使我们可以自由地填充新列。

以下是测试数据:

SQL> select * from your_table;

COL0             COL1       COL2       COL3
---------- ---------- ---------- ----------
                   12         34         35
                   56         34         35
                   13         56         35
                   56         34         35
                   12         56         34

SQL> 

这是一个PL / SQL例程,它使用批量操作来更新表中的所有行。

SQL> declare
  2      -- this collection type will be available in all Oracle databases
  3      new_col sys.dbms_debug_vc2coll :=
  4         sys.dbms_debug_vc2coll('rox','max','bil','rox','sam');
  5      your_table_rowids sys.dbms_debug_vc2coll;
  6  begin
  7    -- note: solution fits given data, so does not bother to handle large volumnes
  8    select rowidtochar(yt.rowid)
  9    bulk collect into your_table_rowids
 10    from your_table yt;
 11
 12    -- NB: this is not a loop, this is a bulk operation
 13    forall idx in your_table_rowids.first()..your_table_rowids.last()
 14       update your_table yt
 15           set yt.col0 = new_col(idx)
 16           where yt.rowid = chartorowid(your_table_rowids(idx))
 17    ;
 18  end;
 19  /

PL/SQL procedure successfully completed.

SQL>

由于您的表没有主键和重复行,因此必须使用ROWID

无论如何,这是结果:

SQL> select * from your_table
  2  /

COL0             COL1       COL2       COL3
---------- ---------- ---------- ----------
rox                12         34         35
max                56         34         35
bil                13         56         35
rox                56         34         35
sam                12         56         34

SQL> 

答案 1 :(得分:0)

written an answer which uses DDL and UPDATE to change the database state我正确地阅读了问题标题8-)所以这是一个选择伪列COL0的查询。

用这个测试数据:

SQL> select * from your_table
  2  /

      COL1       COL2       COL3
---------- ---------- ----------
        12         34         35
        56         34         35
        13         56         35
        56         34         35
        12         56         34

SQL> with nt as (
  2      select column_value as col0
  3                , rownum as rn
  4     from
  5      table(sys.dbms_debug_vc2coll('rox','max','bil','rox','sam'))
  6  )
  7  select nt.col0
  8             , yt.col1
  9             , yt.col2
 10             , yt.col3
 11  from nt
 12      join ( select t.*
 13                   , rownum as rn
 14           from your_table t) yt
 15      on yt.rn = nt.rn 
 16  /

COL0             COL1       COL2       COL3
---------- ---------- ---------- ----------
rox                12         34         35
max                56         34         35
bil                13         56         35
rox                56         34         35
sam                12         56         34

SQL>