0

これが私のデータベーススキーマの最も関連性の高い部分です:

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)
);

複数のテストから構成されるセッションがあります。SESSIONS の TEST には ORDINAL があります (順序付けられています)。SESSION_TEST は、多対多の関係のリンク テーブルです。1 つのテストを複数のセッションの一部にすることができ、1 つのセッションを複数のテストで構成することができます (ただし、1 つのテストを 1 つのセッションに含めることができるのは 1 回だけで、これが PK です)。

そのテストとそのテストのみを持つセッションがある場合 (つまり、セッションは、私が探している 1 つのテストのみで構成されます)。例えば:

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 には 2 つの TEST があり、SESSION 2 と 3 にはそれぞれ 1 つのテストがあります。入力 1 と 3 では 1/true を返しますが、2 では 0 を返す選択が必要です (この TEST は SESSION 1 のみで行われますが、それだけではありません)。

(タイトルについて申し訳ありません。私はそれをいくつかの文にまとめて明確にする方法を本当に知りませんでした!)。

4

1 に答える 1

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 EXISTSTSQL のみかもしれませんが、全体像はわかります。クエリが行を返す場合は true を返し、そうでない場合は false を返します。

于 2012-05-09T20:48:06.980 に答える