Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 连接两个表但删除另一个表中已存在的行_Sql_Postgresql_Join_Duplicates - Fatal编程技术网

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