在最近的一次编程面试中,我被问到一个 SQL 问题,我给出了我认为合理的答案,但我的回答引起了 dba 的强烈反对,我无法弄清楚原因。
从那以后,我对这个问题进行了更多的思考,但我无法弄清楚我的答案有什么可怕的,所以我在这里寻求启发以找出正确的方法,或者失败,更好的方法来生成报告图书馆的数量和其中的书籍数量来自包含图书馆表和书籍表的数据库。
我应该注意到我已经稍微改变了场景,因此措辞与面试问题不同,但任务是相同的。
这是该问题的最小架构:
create table library (
id integer primary key,
name char(8)
);
create table book (
id integer primary key,
name char(8),
library_id integer,
foreign key (library_id) references library(id)
);
任务是为拥有两本书或更多本书的图书馆列出图书馆的名称和其中的书籍数量。
而且,这是我提出的解决方案:
select
a.name as name,
b.nbooks as nbooks
from
library as a,
(
select
min(library_id) as library,
count(id) as nbooks
from
book
group by
library_id
) as b
where
( nbooks > 1 ) and (a.id = b.library)
;
再想一想,使用显式inner join
可能会更好。除此之外,您能否向我指出潜在的陷阱(一般的或与特定数据库相关的)以及生成此报告的正确方法?