簡體   English   中英

左桌子上有特殊條件的左連接

[英]left join with special condition on right table

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

創建表文檔(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)

或者,如果您想要沒有修訂的文檔(這可能嗎?)

   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

數據庫設計:Hernandez的僅凡人數據庫設計

SQL: 實用SQL手冊

如果您想傷腦袋,請參閱Joe Celko撰寫的任何SQL書籍。

這是有關數據庫設計的很好的書籍清單

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

如果每個作業都進行了修訂(例如,從修訂版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

我建議“數據庫設計的Sane方法”作為對良好設計實踐的出色介紹。 (我有點偏見。我寫了它。但是,嘿,到目前為止,它在亞馬遜上有五星級的平均評價,這些評價都不是由我或任何親朋好友提供的。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM