1

これが可能かどうかわかりません..私はsqlite3スキーマを使用しています:

CREATE TABLE docs (ID 整数主キー、名前文字列);
CREATE TABLE revs (id integer 主キー、doc_id integer、number integer);

リビジョンの 1 つだけに結合されたすべてのジョブ、つまり番号が最も大きいものを選択したいと考えています。どうすればこれを達成できますか?現在、私は左結合を行ってすべてを取得してから、アプリケーションでフィルタリングしていますが、これは最悪です..

(ちなみに、データベースとその仕組み、そしておそらく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)

または、Rev のないドキュメントが必要な場合 (これは可能ですか?)

   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 による単なる人間のためのデータベース設計

SQL :実用的な SQL ハンドブック

頭を悩ませたい場合は、Joe Celkoによる SQL の本を読んでください。

于 2009-09-29T20:07:59.403 に答える
0

すべてのジョブにリビジョンがある場合 (たとえば、リビジョン 0 から開始)、OrbMan と同じアプローチを使用しますが、内部結合を使用します。(1 対 1 の一致を探していることが確実な場合は、SQL にも通知してみませんか?)

d.*、r.max_number を選択
ドキュメントdから
内部結合
(
    doc_id、max(number) を max_number として選択
    回転数から
    doc_id でグループ化
) r on d.id = r.doc_id
于 2009-09-30T00:03:01.233 に答える
0

データベース設計に関する非常に優れた書籍のリストを次に示します。

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

于 2009-09-29T19:52:57.430 に答える