在 PostgreSQL 中创建带有连接的视图

Creating views with joins in PostgreSQL

对于我决定进行的一个小型轮班管理项目,我尝试根据每天 3 班的时间表为我们的员工制定每周轮班时间表,其中 1 班可以容纳一名以上的员工。

我创建了一个员工 table 和一个 work_day table 保存轮班日期和 3 加入 tables 为一天中的每个轮班.

CREATE TABLE employee(
    id SERIAL PRIMARY KEY,
    "name" VARCHAR(128) NOT NULL,
    archived BOOLEAN DEFAULT FALSE
);

CREATE TABLE work_day(
    id SERIAL PRIMARY KEY,
    "date" DATE NOT NULL UNIQUE
);

CREATE TABLE morning_shift(
  employee_id INTEGER FOREIGN KEY REFERENCES employee(id),
  shift_id INTEGER FOREIGN KEY REFERENCES work_day(id),
  PRIMARY KEY(employee_id, shift_id)  
);


CREATE TABLE evening_shift(
  employee_id INTEGER FOREIGN KEY REFERENCES employee(id),
  shift_id INTEGER FOREIGN KEY REFERENCES work_day(id),
  PRIMARY KEY(employee_id, shift_id)  
);


CREATE TABLE night_shift(
  employee_id INTEGER FOREIGN KEY REFERENCES employee(id),
  shift_id INTEGER FOREIGN KEY REFERENCES work_day(id),
  PRIMARY KEY(employee_id, shift_id)  
);

我的计划是创建一个视图来具体化工作日的演示文稿:

日期

早班(姓名 1,姓名 2)

晚班(name3, name4)

夜班(name5)

这样我就可以将整个工作日作为项目中的对象进行查询。 问题是我在数据库方面的经验很少,而且事实证明它比我想象的要难得多。最近几天我一直在努力,终于放弃了我的自我,现在我寻求你的谦虚帮助,你如何创造这样的观点。它有许多令人困惑的连接,我无法理解它。

非常感谢您。

正如其他人在评论中提到的,数据库设计还有改进的余地。但是,这是创建视图的方法,只需连接您需要数据的所有表和 select 您想要的字段:

CREATE VIEW shifts AS
    SELECT *
    FROM work_day inner join morning_shift on work_day.id = morning_shift.shift_id
    inner join evening_shift on work_day.id = evening_shift.shift_id
    ... (more joins)

看看这个Postgres tutorial page on joins