2

私は2つのテーブルを持っていDocumentsますRevisions

ドキュメント テーブル

+--------+--------------------+
| DataID |    Description     |
+--------+--------------------+
|      1 | This is document 1 |
|      2 | This is document 2 |
|      3 | This is document 3 |
|      4 | This is document 4 |
|      5 | This is document 5 |  
+--------+--------------------+

リビジョン表

+--------+---------+-----------+
| DataID | Version |   State   |
+--------+---------+-----------+
|      1 |       1 | Published |
|      2 |       1 | Published |
|      3 |       1 | ?         |
|      3 |       2 | Published |
|      4 |       1 | Published |
+--------+---------+-----------+

必要な出力

+--------+--------------------+---------+
| DataID |    Description     | Version |
+--------+--------------------+---------+
|      1 | This is document 1 | 1       |
|      2 | This is document 2 | 1       |
|      3 | This is document 3 | 2       |
|      4 | This is document 4 | 1       |
|      5 | This is document 5 | N/A     |
+--------+--------------------+---------+

私のクエリ:

SELECT d.*, h.version 
FROM documents d 
LEFT revisions h 
   ON h.dataID=d.dataID 
LEFT JOIN ( 
           SELECT dataID, MAX(version) as version 
           FROM revisions 
           GROUP BY dataID 
         ) dh 
    ON dh.dataID=h.dataID 
    AND dh.version=h.version 
    AND h.state='Published'

この左結合の問題は、version 1のもリストdocid 3state ?ますが、公開されたバージョンがある場合はそれのみが必要です。そうでない場合は、バージョンが NULL のリスト ドキュメントをリストするだけです。

編集:バージョン番号だけでなく、エントリが見つかった場合は、データからすべての列データ も欲しいことに注意してください 。revision

4

2 に答える 2

3

h.state句からフィルタリングすることによりWHERE、外部結合を内部結合に暗黙的に変換しています。代わりに、その条件を結合基準に配置する必要があります。

SELECT   d.*, MAX(h.Version)
FROM     documents d LEFT JOIN revisions h
      ON h.DataID = d.DataID
     AND h.state  = 'Published'
GROUP BY DataID

sqlfiddleで参照してください。

于 2013-06-12T15:54:55.193 に答える
0

これを試して:

SELECT d.*, dh.version FROM document d 
LEFT JOIN ( 
           SELECT dataID, MAX(version) as version, state
           FROM revisions 
           GROUP BY dataID,version 
         ) dh 
    ON dh.dataID=d.dataID 
    AND dh.state='Published';

これがSQLFiddleです。

于 2013-06-12T15:56:43.077 に答える