不知道这是否可能..我正在使用 sqlite3 模式:
CREATE TABLE docs(id 整数主键,名称字符串);
CREATE TABLE revs(id 整数主键,doc_id 整数,数字整数);
我想选择只加入其中一个修订版的每个作业,即编号最高的作业。我怎样才能做到这一点?现在我正在做一个左连接并获取所有内容,然后我在应用程序中过滤它,但这很糟糕..
(顺便说一句,你能给我推荐一本关于数据库以及它们如何工作的好而简单的介绍性书籍,也许还有一些关于 sql 的东西..)谢谢!
试试这个
Select * From docs d
Join revs r
On r.doc_id = d.id
Where r.number =
(Select Max(number ) from revs
Where Doc_Id = d.Id)
或者,如果您想要没有 Revs 的文档(这可能吗?)
Select * From docs d
Left Join revs r
On r.doc_id = d.id
And r.number =
(Select Max(number ) from revs
Where Doc_Id = d.Id)
不确定您的引擎是否支持这一点,但通常,您会在 ANSI SQL 中执行以下操作:
SELECT docs.*
,revs.*
FROM docs
INNER /* LEFT works here also if you don't have revs */ JOIN revs
ON docs.id = revs.doc_id
AND revs.number IN (
SELECT MAX(number)
FROM revs
WHERE doc_id = docs.id
)
有许多方法可以编写等效查询,使用公用表表达式、相关聚合子查询等。
select d.*, r.max_number
from docs d
left outer join (
select doc_id, max(number) as max_number
from revs
group by doc_id
) r on d.id = r.doc_id
这是一个非常好的数据库设计书籍清单
如果每个作业都有修订(例如,从 rev 0 开始),我会使用与 OrbMan 相同的方法,但使用内部连接。(如果您确定您正在寻找一对一的匹配。为什么不让 SQL 也知道呢?)
选择 d.*, r.max_number
来自文档 d
内部联接
(
选择 doc_id, max(number) 作为 max_number
从转速
按 doc_id 分组
) d.id 上的 r = r.doc_id
我推荐“A Sane Approach to Database Design”作为对良好设计实践的极好介绍。(我有点偏见。我写的。但是,到目前为止,它在亚马逊上的平均评论是 5 星,这些评论都不是由我或任何朋友或亲戚提供的。)