0

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

0 回答 0