Sqlite 左连接复合键

Sqlite left join composite keys

为静态 ORM 展开 SQLite 数据透视查询,问题是缺少值需要空值。

table student
student_id | name
    1       "Fred"
    2       "Tim"
PK(`student_id`)

table grade 
student_id | data_id | grade
    1           1       5.0
    1           2       5.0
    2           2       5.0
PK(`student_id`,`data_id`),
FK(student.studentid)
FK(data.data_id)

table data 
data_id | description
   1       "summer"
   2       "autumn"
PK(`data_id`)

我需要结果包含空行,以便静态 ORM 正确制表。在我看来,这应该意味着 LEFT 连接:

SELECT * FROM student
join grade using (student_id)
LEFT OUTER JOIN data
ON grade.data_id = data.data_id

由于蒂姆暑期考试缺席,student_id | data_id PK_pair(2,1) 在 table 年级。

当前查询returns:

sID |  name  | dID | grade | description
"1"   "Fred"   "1"   "5.0"   "summer"
"1"   "Fred"   "2"   "5.0"   "autumn"
"2"   "Tim"    "2"   "5.0"   "autumn"

结果中缺少此行:

sID |  name  | dID | grade | description
"2"    "Tim"   "1"    null    "summer"

左连接 returns 内连接行加上不匹配的左 table 行由空值扩展。如果您认为您想要左连接,那么您需要确定关联的内部连接。在这里你似乎不知道 tables & 条件。但是您似乎至少希望每个可能的学生数据对都有一行;事实上,对于 (student_id, name) & (data_id, description) 的每个组合。所以那些必须在左边 table。另外,列 grade 为空,因此推测它与右 table 有关。也许你想要:

select *
from students
natural join data
left natural join grade

我选择该查询是因为它(公共列中没有空值且没有重复行):

/* rows where
    student [student_id] has name [name]
and term [data_id] has description [description]
and (student [student_id] got grade [grade] in term [data_id]
    or not exists grade [student [student_id] got grade [grade] in term [data_id]]
    and [grade] is null
    )
/*

Sqlite left join composite keys

虽然约束告诉我们一些关于查询结果的信息,但它们并不是查询所必需的。需要的是查询结果的隶属度标准,即它的(特征)谓词。在这种情况下,我给出了该代码注释。请注意它是如何从基础 tables' criteria/predicates:

构建的
  • natural join 包含满足其 table 的 criteria/predicates 的 and 的行。
  • left natural join 持有满足其左侧 table 的 and 成员资格标准的行,使用右侧 table 的 or criterion/predicate&每列右边唯一的条件tableis null

Is there any rule of thumb to construct SQL query from a human-readable description?.

(如果列 descriptionname 具有相同的名称,那么您必须在 natural join 之前重命名一个或使用 inner join using (student_id, data_id)。但同样,这将产生于编写适当的谓词。)