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

时间:2018-07-23 04:00:41

标签: sql oracle sql-insert ddl

表:已出售

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

我必须基于上面给出的Sold表创建一个新表,该表具有一个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

1 个答案:

答案 0 :(得分:0)

您写的查询表明还有另一个表items,但我们不知道它的外观或包含的内容-因此,我在发挥我的想象力。

对表和数据进行采样(请注意,您不能使用user作为列名; Oracle中有一个函数可以返回当前登录的用户,所以我给它加上了“ c_”作为前缀): / p>

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>