1

私は3つのテーブルを持っています:

CREATE TABLE activities (
activity varchar(20) Primary key
);

データ付き:

Table_Tennis1
Table_Tennis2
Table_Tennis3

CREATE TABLE times (
time varchar(5)
);

データ付き

09:00
10:00
11:00
12:00
13:00
14:00
15:00
16:00
17:00
18:00
19:00
20:00

そして最後に

CREATE TABLE planner (
day varchar(9) foreign key
time varchar(5) foreign key
activity varchar(20) foreign key
member bigint foreign key
);

および主キー = (日、時間、活動)

データ付き

friday,09:00,Table_Tennis1,4
friday,10:00,Table_Tennis2,2

特定の日の特定の時間に使用されていないすべての卓球室、または 1 日のすべての時間でまだ予約されていないすべての部屋を見つけることができるのだろうかと思っていました。

だからそれは私にresult_setを与えるはずです

09:00, Table_Tennis2, Table_Tennis3
10:00, Table_Tennis1, Table_Tennis3
11:00, Table_Tennis1, Table_Tennis2, Table_Tennis3 ect ect
4

1 に答える 1

1

特定の日の特定の時間に使用されていないすべてのTable_Tennisルーム、

SELECT activity
FROM   activities a
WHERE  NOT EXISTS (
    SELECT *
    FROM   planner p
    WHERE  p.activity ~~ 'Table_Tennis%' -- may or may not be needed
    AND    p.day  = 'friday'
    AND    p.time = '09:00'
    AND    p.activity = a.activity -- was missing in my 1st draft
    );

1日すべての時間にまだ予約されていないすべての部屋。

SELECT a.activity
FROM   activities a
LEFT JOIN (
    SELECT activity
    FROM   planner p
    WHERE  day = 'friday'
    GROUP  BY 1
    HAVING count(*) = 12 -- assuming there are exactly 12 slots
    ) p USING (activity)
WHERE p.activity IS NULL; -- excludes all fully booked rooms

または:

SELECT activity
FROM   activities a
WHERE NOT EXISTS (
    SELECT activity
    FROM   planner p
    WHERE  day = 'friday'
    GROUP  BY 1
    HAVING count(*) = 12 -- assuming there are exactly 12 slots
    );

だがしかし:


SELECTアクティビティ
FROMアクティビティ
加入 (
    SELECTアクティビティ
    プランナーpから
    WHERE day='金曜日'
    GROUP BY 1
    HAVING count(*)<12
    )p USING(アクティビティ);

...それは、その日のエントリがまったくない部屋をドロップするためです。


あなたは使用を検討するかもしれません

slot time

それ以外の

time varchar(5)

time識別子として使用しないでください。これは、すべてのSQL標準では予約語であり、PostgreSQLでは型名です。
また、データ型timeは目的に適していて、占有するスペースが。よりも少なくなりますvarchar(5)

日付外部キー..。
、スロット時間外部キー..。

それ以外の

 day varchar(9) foreign key ...
,time varchar(5) foreign key ...

平日の名前で一週間をカバーできます。それ以上のものが欲しいと思います。

于 2012-04-21T18:10:55.557 に答える