繁体   English   中英

在Oracle SQL中使用来自另一个表的数据创建一个新表

[英]Create a new table in Oracle SQL with data from another table

表:出售

user        date_sold       item        price
Ram         ‘2018-01-01’    ABDS21      24
Roze        ‘2018-01-02’    ASAS31      100

我必须基于上面给出的Sold表创建一个新表,该表具有一个值为Boolean的sold_already列。

  • 如果他们以前卖过该商品,则为'true'
  • 如果是他们第一次出售该商品,则为'false'

这是我的查询,但不起作用:

CREATE table sold_boughtsign 
    ( user varchar, 
      date_sold date, 
      item varchar, 
      price number, 
      bought_before boolean);

INSERT INTO sold_boughtsign 
  (user, date_sold,item, price) 
SELECT user, date_sold,item, price
FROM sold 
IF(bought_before IS NULL, FALSE, TRUE) 
From User INNER JOIN items ON user=item

您写的查询表明还有另一个表items ,但是我们不知道它的外观或包含什么-因此,我在用自己的想象力。

示例表和数据(请注意,您不能将user用作列名; Oracle中有一个函数可以返回当前登录的用户,因此我在其前面加上了“ c_”作为前缀):

SQL> create table items (item varchar2 (20));

Table created.

SQL> create table sold
  2  (
  3     c_user      varchar2 (20),
  4     date_sold   date,
  5     item        varchar2 (20),
  6     price       number
  7  );

Table created.

SQL>
SQL> insert into items
  2    select 'ABDS21' from dual union
  3    select 'ASAS31' from dual union
  4    select 'XXX'    from dual;

3 rows created.

SQL> insert into sold
  2    select 'Ram' , date '2018-01-01', 'ABDS21', 24  from dual union
  3    select 'Roze', date '2018-01-02', 'ASAS31', 100 from dual;

2 rows created.

SQL>

一个新表:由于SQL中没有布尔数据类型,我们必须选择如何克服该限制。 例如,您可以使用NUMBER数据类型并存储0(代表false)和1(代表true)。 我选择了VARCHAR2数据类型,并在其中输入“ Y”(因为“是,商品已售出”)和“ N”(不,它尚未售出)。 另外,我创建了一个检查约束,以确保用户不能在该列中输入其他任何内容。

SQL> create table sold_boughtsign
  2  (
  3     c_user          varchar2 (20),
  4     date_sold       date,
  5     item            varchar2 (20),
  6     price           number,
  7     bought_before   varchar2 (1) check (bought_before in ('Y', 'N'))
  8  );

Table created.

SQL>

最后,让我们填充该表:

SQL> insert into sold_boughtsign
  2    (c_user, date_sold, item, price, bought_before)
  3  select s.c_user, s.date_sold, i.item, s.price,
  4    decode(s.date_sold, null, 'N', 'Y') bought_before
  5  from items i left join sold s on s.item = i.item;

3 rows created.

SQL> select * from sold_boughtsign;

C_USER               DATE_SOLD  ITEM                      PRICE B
-------------------- ---------- -------------------- ---------- -
Ram                  2018-01-01 ABDS21                       24 Y
Roze                 2018-01-02 ASAS31                      100 Y
                                XXX                             N

SQL>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM