PostgreSQL查询未按预期返回结果

时间:2019-06-29 15:27:52

标签: sql postgresql

我想生成一个清单,列出所有水手在特定日期预订船的所有日子。

表方案如下:

def cy_func(string b):
    remove_nulls(b)  # no copying
    return b

数据如下:

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

,但它返回所有日期的列表,无一例外。它应该返回的唯一日期是“ 09/08/98”。我该如何解决?

2 个答案:

答案 0 :(得分:2)

我将您的查询表达为:

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

Demo

上面的查询说要返回RESERVE表中任意一天的SID水手人数与每个水手人数相匹配的一天。

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

答案 1 :(得分:1)

采用每天只计算唯一水手人数的方法略有不同:

SELECT day FROM (
  SELECT COUNT(DISTINCT sid), day FROM reserve GROUP BY day
) AS sailors_per_day
WHERE count = (SELECT COUNT(*) FROM sailor);
+------------+
| day        |
|------------|
| 1998-09-08 |
+------------+