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?.
(如果列 description
和 name
具有相同的名称,那么您必须在 natural join
之前重命名一个或使用 inner join
using (student_id, data_id)
。但同样,这将产生于编写适当的谓词。)
为静态 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?.
(如果列 description
和 name
具有相同的名称,那么您必须在 natural join
之前重命名一个或使用 inner join
using (student_id, data_id)
。但同样,这将产生于编写适当的谓词。)