oracle 如何使用SQL创建一个虚拟列来计算每行座位数的总和?

i2byvkas  于 2023-06-05  发布在  Oracle
关注(0)|答案(1)|浏览(233)

无法在适当条件下添加虚拟列

我的任务是使用sql创建一个表示ER图的数据库。我有两张表,我相信它们是针对我必须问的问题的:

  • 表1:“座位”和
  • 表2:“行”

我想写SQL的问题是:
添加虚拟列以计算每一行中的座位总数。
所述表格的创建如下:

CREATE TABLE "row"(
"rowID" NUMBER(5) PRIMARY KEY,
numbers NUMBER(5) NOT NULL,
seats NUMBER(5) NOT NULL,
auditoriumID NUMBER(5),
CONSTRAINT row_aud_fk FOREIGN KEY(auditoriumID) REFERENCES auditorium(auditoriumID));

CREATE SEQUENCE seq_row
START WITH 10
INCREMENT BY 1
MAXVALUE 100
NOCYCLE
CACHE 5;

CREATE TABLE seat(
seatID NUMBER(5) PRIMARY KEY,
"rowID" NUMBER(5),
numbers NUMBER(5) NOT NULL,
"name" NVARCHAR2(26) NOT NULL,
typeID NUMBER(5),
CONSTRAINT seat_row_fk FOREIGN KEY("rowID") REFERENCES "row"("rowID"),
CONSTRAINT seatType_fk FOREIGN KEY(typeID) REFERENCES "seatType"("typeID"));

CREATE SEQUENCE seq_singularseat
START WITH 1000
INCREMENT BY 1
MAXVALUE 10000
NOCYCLE
CACHE 5;

主要的障碍是我必须使用算术表达式,不能使用子查询(或者至少它对我不起作用)
PS:由于没有限制,这应该有表,你可以尝试行以及。座位对我来说似乎是一个更可能的选择。
举一个我尝试过的例子:

ALTER TABLE seat
ADD total_seats_per_row NUMBER GENERATED ALWAYS AS
  (SELECT COUNT(*) FROM seat s WHERE s.rowID = seat.rowID) VIRTUAL;
tyu7yeag

tyu7yeag1#

我简化了你的例子(没有外键,删除了双引号(我只是讨厌它们)。

SQL> create table seat
  2    (seat_id     number primary key,
  3     row_id      number,
  4     seat_number number
  5    );

Table created.

SQL> create table t_row
  2    (row_id     number primary key,
  3     row_number number
  4    );

Table created.

样本数据:

SQL> insert all
  2    into t_row values (1, 1)
  3    into t_row values (2, 2)
  4    into seat  values (1, 1, 3)         --> 4 seats in row 1
  5    into seat  values (2, 1, 4)
  6    into seat  values (3, 1, 8)
  7    into seat  values (4, 1, 11)
  8    into seat  values (5, 2, 6)         --> 1 seat in row 2
  9  select * From dual;

7 rows created.

由于对虚列的某些限制(不能引用其他表中的列),我将创建一个确定性函数(必须是;否则,这将不起作用):

SQL> create or replace function f_total_seats_per_row (par_row_id in number)
  2    return number deterministic
  3  is
  4    retval number;
  5  begin
  6    select count(*) into retval
  7      from seat
  8      where row_id = par_row_id;
  9    return retval;
 10  end;
 11  /

Function created.

虚拟列:

SQL> alter table t_row add
  2    (total_seats_per_row as (f_total_seats_per_row(row_id)));

Table altered.

测试:
这是一个普通的查询返回的内容:

SQL> select row_id, count(*) number_of_seats from seat group by row_id;

    ROW_ID NUMBER_OF_SEATS
---------- ---------------
         1               4
         2               1

包含虚列的表返回什么?同样的数据:

SQL> select * from t_row;

    ROW_ID ROW_NUMBER TOTAL_SEATS_PER_ROW
---------- ---------- -------------------
         1          1                   4
         2          2                   1

我们在第二排再加一个座位怎么样?

SQL> insert into seat values (6, 2, 1);

1 row created.

SQL> select * from t_row;

    ROW_ID ROW_NUMBER TOTAL_SEATS_PER_ROW
---------- ---------- -------------------
         1          1                   4
         2          2                   2
                                        ^ 
                                        |
                     here it is; 2 seats in the 2nd row

看看有没有用

相关问题