Sql 连接两个表但删除另一个表中已存在的行
我有四张桌子: 日子 这些日子从Sql 连接两个表但删除另一个表中已存在的行,sql,postgresql,join,duplicates,Sql,Postgresql,Join,Duplicates,我有四张桌子: 日子 这些日子从周一到周六 时代 CREATE TABLE times ( time time Primary Key, peak text ); 从上午8:00到晚上9:00的时间间隔,如8:00、9:00、10:00、11:00 活动 CREATE TABLE activities ( activity text primary key ); 规划师 CREATE TABLE planner ( day text foriegn key references days
周一
到周六
时代
CREATE TABLE times (
time time Primary Key,
peak text
);
从上午8:00到晚上9:00的时间间隔,如8:00、9:00、10:00、11:00
活动
CREATE TABLE activities (
activity text primary key
);
规划师
CREATE TABLE planner (
day text foriegn key references days (day)
time time foriegn key references times (time)
activity text foriegn key references activities (activity)
member bigint
primary key (day, time, member)
);
planner表将包含以下数据:
friday, 09:00, squash_court1 , 2
friday, 09:00, squash_court2 , 3
friday, 09:00, squash_court3 , 1
我想做的是列出这三个球场的所有未预订时间
所以我会有一个这样的列表
time activity
08:00 squash_court1
10:00 squash_court1
...rest of times...
08:00 squash_court2
10:00 squash_court2
...rest of times...
08:00 squash_court3
10:00 squash_court3
...rest of times...
在8:00和10:00之间没有9:00的原因是因为它已经被预订了
编辑
目前,我有一个基本的连接:
SELECT time , activity FROM times, activities;
我现在只需要WHERE
子句来删除planner
表中预订的项目
谢谢你对这件事的建议
我现在只需要WHERE
子句来删除planner
表中预订的项目
这可以通过多种方式实现<代码>左连接/何处。。为空通常生成PostgreSQL中最快的计划:
SELECT t.time, a.activity
FROM (days d CROSS JOIN times t CROSS JOIN activities a)
LEFT JOIN planner p ON (p.day, p.time, p.activity)
= (d.day, t.time, a.activity)
WHERE p.activity IS NULL;
我使用括号明确表示您希望先交叉连接
(与表之间的逗号相同)天
和时间
和活动
。这些括号是多余的,因为默认情况下表是从左到右连接的
JOIN
条件只是以下条件的一个较短形式:
ON p.day = d.day
AND p.time = t.time
AND p.activity = a.activity
另一种方法是
不存在
半联接:
SELECT t.time, a.activity
FROM (days d CROSS JOIN times t CROSS JOIN activities a)
WHERE NOT EXISTS (
SELECT *
FROM planner
WHERE (p.day, p.time, p.activity)
= (d.day, t.time, a.activity)
);
太好了,谢谢你,哪有一天可以这么做。因为可能是星期五,有些东西被预订了,星期六不同的东西被预订了,我想看看wto不同的fridya和satruday表格。@DannyCalladine:我补充了缺少的天数。好吧,那给我看看day表格中的每一天,如果我想为它选择一个具体的日期给我看呢。所以我想看看上面的陈述所证实的表中的星期五部分,如果我想选择一个具体的activity@DannyCalladine:添加到
WHERE
子句中。比如:`d.day='Friday'。活动也是如此。非常基本,真的。
SELECT t.time, a.activity
FROM (days d CROSS JOIN times t CROSS JOIN activities a)
WHERE NOT EXISTS (
SELECT *
FROM planner
WHERE (p.day, p.time, p.activity)
= (d.day, t.time, a.activity)
);