sql - PostgreSQL 查询未按预期返回结果

标签 sql postgresql

我想生成一个列表,其中包含所有水手在特定日期预订船只的所有日期。

表格方案如下:

CREATE TABLE SAILOR(
SID INTEGER NOT NULL,
NAME VARCHAR(50) NOT NULL,
RATING INTEGER NOT NULL,
AGE FLOAT NOT NULL,
PRIMARY KEY(SID)
);

CREATE TABLE BOAT(
BID INTEGER NOT NULL,
NAME VARCHAR(50) NOT NULL,
COLOR VARCHAR(50) NOT NULL,
PRIMARY KEY(BID)
);

CREATE TABLE RESERVE (
SID INTEGER NOT NULL REFERENCES SAILOR(SID),
BID INTEGER NOT NULL REFERENCES BOAT(BID),
DAY DATE NOT NULL,
PRIMARY KEY(SID, BID, DAY));

数据如下:

INSERT INTO SAILOR(SID, NAME, RATING, AGE)
VALUES
  (64, 'Horatio', 7, 35.0),
  (74, 'Horatio', 9, 35.0);

INSERT INTO BOAT(BID, NAME, COLOR)
VALUES
  (101, 'Interlake', 'blue'),
  (102, 'Interlake', 'red'),
  (103, 'Clipper', 'green'),
  (104, 'Marine', 'red');

INSERT INTO RESERVE(SID, BID, DAY)
VALUES+
  (64, 101, '09/05/98'),
  (64, 102, '09/08/98'),
  (74, 103, '09/08/98');

我试过使用这段代码:

SELECT DAY
FROM RESERVE R
WHERE NOT EXISTS (
SELECT SID
FROM SAILOR S
EXCEPT
SELECT S.SID
FROM SAILOR S, RESERVE R
WHERE S.SID = R.SID)
GROUP BY DAY;

但它返回所有日期的列表,无一异常(exception)。它应该返回的唯一一天是“09/08/98”。我该如何解决这个问题?

最佳答案

我会将您的查询表述为:

SELECT r.DAY
FROM RESERVE r
GROUP BY r.DAY
HAVING COUNT(DISTINCT r.SID) = (SELECT COUNT(*) FROM SAILOR);

Demo

上述查询表示返回 RESERVE 表中的任何一天,其不同的 SID 水手计数与每个水手的计数匹配。

这假设 RESERVE 表中的 SID 水手条目只会由实际出现在 SAILOR 表中的水手组成。这似乎是合理的,并且可以使用两个表之间的主键/外键关系来强制执行。

关于sql - PostgreSQL 查询未按预期返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56818732/

相关文章:

mysql - 如何合并 mysql 中的这些列还是应该使用另一个连接?

sql - 获取 GROUP BY 后的行数

postgresql - 我怎样才能加快这个更新声明

postgresql - 在 Ansible Playbook 中指定 PostgreSQL 密码

PostgreSQL 错误缓存查找失败的关系 - 是什么原因造成的?为什么?

sql - SQL Server 2016中order by子句中的单例多列

sql - 如何检查与 rails 中的 where 语句的空关联?

sql - 返回包含最近 24 小时计数的记录

文本值包含\0(反斜杠 0)的 Postgresql COPY

javascript - Tinymce 文本颜色