【发布时间】:2021-02-25 11:32:33
【问题描述】:
创建的表和进行的查询不是这个问题的主要焦点,让我困惑的是为什么第一个查询和第二个查询返回不同的行数
drop table Reserves;
drop table Sailors;
drop table Boats;
create table Sailors (
sid char(1) not null,
sname char(1) not null,
rating int,
age int not null,
primary key (sid)
);
create table Boats (
bid char(1) not null,
bname char(1) not null,
color varchar(5),
primary key (bid)
);
create table Reserves (
sid char(1) not null,
bid char(1) not null,
rdate int not null,
primary key (sid, bid, rdate),
foreign key (sid) references Sailors(sid)
on delete cascade,
foreign key (bid) references Boats(bid)
on delete cascade
);
------------------------------------------------------------------------------
-- Insert values
insert into Sailors values ('1', 'q', 90, 24);
insert into Sailors values ('0', 's', 60, 22);
insert into Sailors values ('2', 'd', 80, 20);
insert into Sailors values ('3', 'w', 70, 18);
insert into Sailors values ('4', 'a', 60, 19);
insert into Sailors values ('5', 'l', 80, 17);
insert into Sailors values ('6', 'o', 90, 18);
insert into Sailors values ('7', 'q', 70, 20);
insert into Sailors values ('8', 'd', 60, 16);
insert into Sailors values ('9', 'i', 80, 22);
insert into Boats values ('0', 'U', 'red');
insert into Boats values ('1', 'P', 'red');
insert into Boats values ('2', 'Q', 'blue');
insert into Boats values ('3', 'C', 'green');
insert into Boats values ('4', 'L', 'blue');
insert into Boats values ('5', 'O', 'blue');
insert into Boats values ('6', 'A', 'red');
insert into Boats values ('7', 'C', 'red');
insert into Boats values ('8', 'Y', 'green');
insert into Boats values ('9', 'N', 'blue');
insert into Reserves values ('0', '0', 3);
insert into Reserves values ('0', '1', 2);
insert into Reserves values ('0', '2', 1);
insert into Reserves values ('0', '2', 3);
insert into Reserves values ('1', '0', 4);
insert into Reserves values ('3', '2', 2);
insert into Reserves values ('4', '0', 3);
insert into Reserves values ('4', '0', 1);
insert into Reserves values ('4', '1', 3);
insert into Reserves values ('4', '6', 4);
insert into Reserves values ('4', '7', 1);
insert into Reserves values ('5', '8', 2);
insert into Reserves values ('5', '9', 2);
insert into Reserves values ('7', '4', 4);
insert into Reserves values ('7', '5', 1);
insert into Reserves values ('8', '3', 2);
insert into Reserves values ('9', '3', 3);
insert into Reserves values ('9', '0', 1);
insert into Reserves values ('9', '6', 1);
insert into Reserves values ('9', '8', 2);
commit;
select *
from Sailors join Boats on color='red' natural left outer join Reserves
where rdate is null;
select sid
from Sailors join Boats on color='red' natural left outer join Reserves
where rdate is null;
我想找到没有订购所有红船的水手的 sid,上面的第一个查询返回了我期望的正确行,但是第二个查询只返回 sid=2 和 sid=6 的行,尽管这两个查询是相同的。 sid 2 和 6 的水手是唯一没有预订任何船的水手。
【问题讨论】:
-
我认为第一个查询是返回您想要的记录,而不是其他任何事情——因为编写的 SQL 是毫无意义的。当您说“没有订购所有红船的水手”时,您是指没有预订红船的水手还是没有预订红船的水手?
-
侧面观察:在 SAILORS 中有一个 AGE 列。但“年龄”总是在变化。与其尝试存储某物/某人不断变化的“年龄”,不如将起源/出生日期存储为 DATE。然后你总是可以通过简单地从 sysdate 中减去birth_date 来准确计算年龄。
-
@NickW - 我还没有检查查询;我假设你是对的。但即便如此,问题仍然存在。这两个查询如果不正确,即使输出错误,也应该在输出中产生相同数量的行。 OP 询问为什么不是这样。
-
@mathguy Thx,这正是我要问的问题,创建的表和上面编写的查询绝对不实用,但我更好奇为什么第二个查询只返回带有 sid= 的行2 和 sid=6,而第一个查询返回所有具有空 rdate 列的行
-
@NickW,因为有多个红船,我的目标是找到根本没有预订的水手,或者有预订但没有预订所有红船的水手。
标签: sql oracle oracle-sqldeveloper