我是 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