表:已出售
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
答案 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>