Создать новую таблицу в Oracle SQL с данными из другой таблицы
Стол: продан
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 ответ
Запрос, который вы написали, предполагает, что есть еще одна таблица, 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>