1

不知道这是否可能..我正在使用 sqlite3 模式:

CREATE TABLE docs(id 整数主键,名称字符串);
CREATE TABLE revs(id 整数主键,doc_id 整数,数字整数);

我想选择只加入其中一个修订版的每个作业,即编号最高的作业。我怎样才能做到这一点?现在我正在做一个左连接并获取所有内容,然后我在应用程序中过滤它,但这很糟糕..

(顺便说一句,你能给我推荐一本关于数据库以及它们如何工作的好而简单的介绍性书籍,也许还有一些关于 sql 的东西..)谢谢!

4

7 回答 7

4

试试这个

   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)
于 2009-09-29T19:53:47.413 回答
3

不确定您的引擎是否支持这一点,但通常,您会在 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
    )

有许多方法可以编写等效查询,使用公用表表达式、相关聚合子查询等。

于 2009-09-29T19:56:33.990 回答
2
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
于 2009-09-29T20:05:53.253 回答
1

数据库设计:Hernandez为 Mere Mortals设计的数据库

SQL :实用 SQL 手册

如果您想伤脑筋,请阅读Joe Celko的任何 SQL 书籍。

于 2009-09-29T20:07:59.403 回答
0

这是一个非常好的数据库设计书籍清单

https://stackoverflow.com/search?q=database+book

于 2009-09-29T19:52:57.430 回答
0

如果每个作业都有修订(例如,从 rev 0 开始),我会使用与 OrbMan 相同的方法,但使用内部连接。(如果您确定您正在寻找一对一的匹配。为什么不让 SQL 也知道呢?)

选择 d.*, r.max_number
来自文档 d
内部联接
(
    选择 doc_id, max(number) 作为 max_number
    从转速
    按 doc_id 分组
) d.id 上的 r = r.doc_id
于 2009-09-30T00:03:01.233 回答
0

我推荐“A Sane Approach to Database Design”作为对良好设计实践的极好介绍。(我有点偏见。我写的。但是,到目前为止,它在亚马逊上的平均评论是 5 星,这些评论都不是由我或任何朋友或亲戚提供的。)

于 2009-10-01T21:20:53.653 回答