多对多关系,根据其元素查询一侧

  • 本文关键字:元素 查询 关系 sql sqlite
  • 更新时间 :
  • 英文 :


这是我的数据库架构中最相关的部分:

create table TEST (
    ID integer not null,
    NAME text not null,
    constraint PK_TEST primary key (ID),
    constraint UNQ_TEST_NAME unique (NAME)
);
create table SESSION (
    ID integer not null,
    constraint PK_SESSION primary key (ID)
);
create table SESSION_TEST (
    SESSION_ID integer not null,
    TEST_ID integer not null,
    ORDINAL integer not null,
    constraint PK_SESSION_TEST primary key (SESSION_ID, TEST_ID),
    constraint FK_SESSION_TEST_SESSION_ID foreign key (SESSION_ID) references SESSION (ID) on delete cascade,
    constraint FK_SESSION_TEST_TEST_ID foreign key (TEST_ID) references TEST (ID) on delete cascade,
    constraint UNQ_SESSION_TEST_SESSION_ID_ORDINAL unique (SESSION_ID, ORDINAL)
);

有些会话由多个测试组成。会话中的测试具有顺序(已排序(。SESSION_TEST是多对多关系的链接表:一个测试可以是多个会话的一部分,一个会话由多个测试组成(但一个测试只能在一个会话中出现一次,这就是 PK(。

如果有一个会话具有该测试并且仅具有该测试(换句话说,会话仅包含一个测试,即我正在寻找的测试(,则我在编写一个 SQL 语句时遇到问题,该语句将返回 true(实际上为 1,因为我正在使用 SQLite(。例如:

TEST:
ID|NAME
1|aaa
2|bbb
3|ccc
SESSION:
ID
1
2
3
4
SESSION_TEST:
SESSION_ID|TEST_ID|ORDINAL
1|1|1
1|2|2
2|1|1
3|3|1

ID = 1 的会话有两个测试,会话 2 和 3 各有一个测试。我需要有一个选择,它将为输入 1 和 3 返回 1/true,但为 0 返回 2(因为此测试仅在会话 1 中,但它不是唯一的(。

(对不起标题,我真的不知道如何用几句话来表达并把它说清楚!

RETURN EXISTS SELECT SESSION_ID FROM 
SESSION_TEST
WHERE TEST_ID = @id
AND ORDINAL = 1
AND SESSION_ID NOT IN (SELECT SESSION_ID FROM SESSION_TEST WHERE ORDINAL > 1);

RETURN EXISTS语法可能只是 TSQL,但您可以了解情况。 如果查询返回行,则返回 true,如果不返回 false。

最新更新