我已经搜索和处理这个问题好几个小时了,我相信有一个超级简单的方法可以做到这一点。
我有两张桌子:

CREATE TABLE Students
(
    idnr            NUMERIC(10) PRIMARY KEY,
    name            TEXT        NOT NULL,
    login           TEXT        NOT NULL,
    program         TEXT        NOT NULL
);

CREATE TABLE Branches
(
    name            TEXT,
    program         TEXT,
    PRIMARY KEY(name, program)
);

在第三张表中,我想确定学生和分支机构的“程序”是相同的。
CREATE TABLE StudentBranches
(
    student         NUMERIC(10) PRIMARY KEY REFERENCES Students(idnr),
    branch          TEXT        NOT NULL,
    program         TEXT        NOT NULL,
    FOREIGN KEY (branch, program) REFERENCES Branches(name, program),
    FOREIGN KEY (student, program) REFERENCES Students(idnr, program)
);

我遇到的问题是,这篇文章试图从学生课程中获取整个专栏。我只想要那个学生的价值,而不是整个专栏。
澄清:
学生:
idnr | name | login | program
-----+------+-------+-----------
1234 | bob  | 1111  | prog1
2222 | tom  | 2222  | prog2

分支机构:
branch  | program
--------+---------
branch1 | prog1
branch2 | prog2
branch3 | prog1

在这里,Tom应该只能输入带有B1和B3的StudentBranches表,因为他属于Prog1,Prog1是B1的程序。鲍勃只能进入B2。

最佳答案

正如我在评论中所说,很难说你想做什么,但是你试图创建的外键看起来确实很可疑。
如果将每个表限制为仅表示一件事(即分别表示:
一个学生(没有附加的程序,因为那将是同一张桌子的两件事)。
一个程序/分支(不管你叫它什么)
从一个学生到一个分支的连接。
这将导致:

CREATE TABLE Students (
    idnr            NUMERIC(10) PRIMARY KEY,
    name            TEXT        NOT NULL,
    login           TEXT        NOT NULL
);

CREATE TABLE Branches(
    name            TEXT,
    program         TEXT,
    PRIMARY KEY(name, program)
);

CREATE TABLE StudentBranches (
    student         NUMERIC(10) REFERENCES Students(idnr),
    branch          TEXT        NOT NULL,
    program         TEXT        NOT NULL,
    FOREIGN KEY (branch, program) REFERENCES Branches(name, program)
);

要获取学生注册的程序,您必须加入StudentBranches
我已经把PRIMARY KEYStudentBranches中删除了,因为你之前关于“获取整个专栏”的评论听起来像是一个学生应该能够注册多个程序。如果一个学生可以注册一个程序,那么你需要把它加回去。

09-19 01:39