Sqlite左连接复合键

Sqlite左连接复合键,sqlite,left-join,composite-primary-key,cross-join,natural-join,Sqlite,Left Join,Composite Primary Key,Cross Join,Natural Join,展开静态ORM的SQLite pivot查询时,问题是缺少的值需要null 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

展开静态ORM的SQLite pivot查询时,问题是缺少的值需要null

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能够正确地制表。在我看来,这应该意味着左连接:

SELECT * FROM student
join grade using (student_id)
LEFT OUTER JOIN data
ON grade.data_id = data.data_id
由于蒂姆没有参加暑期考试,表中没有学生id数据PK对(2,1)的行

查询当前返回:

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"

左联接返回内部联接行加上由null扩展的不匹配的左表行。如果您认为需要左连接,则需要标识关联的内部连接。在这里,您似乎不知道表格和条件。但您似乎至少希望每个可能的学生数据对都有一行;事实上,对于(学生id,姓名)和(数据id,描述)的每一个组合。所以这些一定在左表中。此外,列grade为null,因此它可能与正确的表有关。也许你想要:

select *
from students
natural join data
left natural join grade
我选择该查询是因为它(对于公共列中没有空值&没有重复行):

Sqlite左连接复合键

尽管约束告诉了我们一些关于查询结果的事情,但不需要查询它们。需要的是查询结果的成员条件,即其(特征)谓词。在本例中,我给出了代码注释。请注意它是如何从基表的条件/谓词构建的:

  • natural join
    保存满足其表标准/谓词的
    的行
  • left natural join
    使用右表的条件/谓词保存满足其左表成员资格条件
    的行,条件是右表
    的每一列都是null


(如果列
description
name
具有相同的名称,那么您必须在
自然连接之前重命名一个,或者使用
内部连接
使用(student\u id,data\u id)
。但是,这同样是由编写适当的谓词引起的。)

左联接返回内部联接行加上由null扩展的不匹配的左表行。如果您认为需要左连接,则需要标识关联的内部连接。在这里,您似乎不知道表格和条件。但您似乎至少希望每个可能的学生数据对都有一行;事实上,对于(学生id,姓名)和(数据id,描述)的每一个组合。所以这些一定在左表中。此外,列grade为null,因此它可能与正确的表有关。也许你想要:

select *
from students
natural join data
left natural join grade
我选择该查询是因为它(对于公共列中没有空值&没有重复行):

Sqlite左连接复合键

尽管约束告诉了我们一些关于查询结果的事情,但不需要查询它们。需要的是查询结果的成员条件,即其(特征)谓词。在本例中,我给出了代码注释。请注意它是如何从基表的条件/谓词构建的:

  • natural join
    保存满足其表标准/谓词的
    的行
  • left natural join
    使用右表的条件/谓词保存满足其左表成员资格条件
    的行,条件是右表
    的每一列都是null


(如果列
description
name
具有相同的名称,那么您必须在
自然连接之前重命名一个,或者使用
内部连接
使用(student\u id,data\u id)
。但同样,这将由编写适当的谓词产生。)

@EbyJacob Hi。当您编辑时,尤其是当您的编辑需要审阅时,请尽可能多地删除问候语、感谢等。还要检查格式化的输出——此处的列标题与data.Hi不一致。未来:用[mvce]更好地编写/接收/理解/回答重新编码的问题。这包括剪切、粘贴和可运行代码。它还包括一个明确的规范——对于任意输入,代码应该完成什么。当然,努力寻找和表达不仅仅是提问的一部分,而是在编码之前和指导编码。而且很难。(对于表/查询来说,最好的方法是通过其行成员资格标准(又称谓词)实现。)(尽管每个函数/程序/系统也有一个输入输出关系谓词。)@EbyJacob Hi。当您编辑时,尤其是当您的编辑需要审阅时,请尽可能多地删除问候语、感谢等。还要检查格式化的输出——此处的列标题与data.Hi不一致。未来:用[mvce]更好地编写/接收/理解/回答重新编码的问题。这包括剪切、粘贴和可运行代码。它还包括一个明确的规范——对于任意输入,代码应该完成什么。当然,努力寻找和表达不仅仅是提问的一部分,而是在编码之前和指导编码。而且很难。(对于表/查询来说,最好的方法是通过其行成员资格标准(又称谓词)实现。)(尽管每个函数/程序/系统也有一个输入输出关系谓词。)