在右表左边加入特殊条件

时间:2009-09-29 19:48:38

标签: sql database join sqlite left-join

不知道这是否可行..我正在使用sqlite3 架构:

CREATE TABLE docs(id integer primary key,name string);
CREATE TABLE revs(id integer primary key,doc_id integer,number integer);

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

(顺便说一下,你能否建议我一本关于数据库的好的和简单的入门书籍以及他们如何工作,也许还有关于sql的东西......) 谢谢!

7 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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
    )

使用公共表表达式,相关聚合子查询等可以通过多种方式编写等效查询。

答案 2 :(得分: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

答案 3 :(得分:1)

数据库设计:Hernandez的Database Design for Mere Mortals

SQL:The Practical SQL Handbook

如果你想要伤害你的头脑,Joe Celko的任何SQL书籍。

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

如果每个作业都有修订版(例如,以rev 0开头),我会使用与OrbMan相同的方法,但使用内部联接。 (如果你确定你正在寻找一对一的比赛。为什么不让SQL知道?)

select d.*, r.max_number
from docs d
inner join
(
    select doc_id, max(number) as max_number
    from revs
    group by doc_id
) r on d.id = r.doc_id

答案 6 :(得分:0)

我建议将“Sane方法数据库设计”作为优秀设计实践的优秀介绍。 (我有点偏颇。我写了。但是,嘿,到目前为止它在亚马逊上有一个5星级的平均评论,其中没有一个评论是由我或任何朋友或亲戚提供的。)