私は PostgreSQL の新しいユーザーです。使用しようとしていますDISTINCT ON
が、目標を達成できません。
これが私のデータベースの簡単なスケッチです:
- バージョン管理されたファイル
- モデルを含むフィールド (フォーム生成用)
n:n
ファイルのバージョンとフィールドの関係
指定したファイルのバージョンのフィールド セット全体を取得したいと考えています。
私の問題は、空の値を持つことができる (そしてそうする) ことです。FileVersion_Field 関係がありません。以下に例を示します。
FileVersion Field
+----------------+---------+---------+ +----------+-------+---------------+
| id_fileversion | id_file | version | | id_field | value | id_fieldmodel |
+----------------+---------+---------+ +----------+-------+---------------+
| 1 | 1 | 1 | | 1 | Smith | 1 |
| 2 | 1 | 2 | | 2 | 20 | 2 |
+----------------+---------+---------+ | 3 | 25 | 2 |
+----------+-------+---------------+
FileVersion_Field FieldModel
+----------------+----------+ +---------------+------+
| id_fileversion | id_field | | id_fieldmodel | type |
+----------------+----------+ +---------------+------+
| 1 | 1 | | 1 | Name |
| 1 | 2 | | 2 | Age |
| 2 | 3 | +---------------+------+
+----------------+----------+
この例では、次の結果を得たいと考えています。
-- id_file=1 & version=1
Name | Smith
Age | 20
-- id_file=1 & version=2
Name |
Age | 25
これが私が試したことですが、うまくいきません:
SELECT DISTINCT ON(FieldModel.id_fieldmodel) *
FROM File
LEFT JOIN FileVersion ON File.id_file = FileVersion.id_file
LEFT JOIN File_Field ON FileVersion.id_fileversion = File_Field.id_fileversion
LEFT JOIN Field ON File_Field.id_field = Field.id_file
RIGHT JOIN FieldModel ON (Field.id_fieldmodel = FieldModel.id_fieldmodel OR FieldModel.id_fieldmodel IS NULL)
WHERE (FieldModel.id_fieldmodel IS NOT NULL AND FileVersion.version = 2 AND File.id_file = 1)
OR (File.id_fieldmodel IS NULL)
ORDER BY FieldModel.id_fieldmodel