gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 14:13:41 27 4
gpt4 key购买 nike

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

表格方案如下:

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com