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

时间:2012-05-09 20:42:35

标签: 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)
);

有些会话由多个TESTS组成。 SESSIONS中的TEST有ORDINAL(已订购)。 SESSION_TEST是多对多关系的链接表:一个测试可以是多个会话的一部分,一个会话由多个测试组成(但一个测试只能在一个会话中进行一次,即PK)。 / p>

如果存在具有该测试且仅有该测试的会话(在其他情况下),我在编写将返回true(或实际上为1,因为我正在使用SQLite)的SQL语句用于具有给定ID的测试时遇到问题单词,会话只包含一个测试,我正在寻找的那个。 例如:

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的SESSION有两个TEST,SESSIONs 2和3各有一个测试。我需要一个选择,对于输入1和3将返回1 / true,但是对于2则返回0(因为此TEST仅在SESSION 1中,但它不是唯一的一个)。

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

1 个答案:

答案 0 :(得分:0)

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。