关系模型&自然返回重复行的查询

人们普遍认为在关系模型中: 每个关系操作都应该产生一种关系。 作为集合的关系不能包含重复的行。 想象一下包含以下数据的“USERS”关系。
ID FIRST_NAME LAST_NAME
 1 Mark       Stone
 2 Jane       Stone
 3 Michael    Stone
如果有人运行查询
select LAST_NAME from USERS
,典型的数据库将返回:
LAST_NAME
Stone
Stone
Stone
由于这不是关系 - 因为它包含重复的行 - 理想的RDBMS应该返回什么?     
已邀请:
“但有些信息丢失了 - 有3个用户使用该姓氏。” 如果具有该名称的用户数量是您感兴趣的,那么您的示例查询不是您应该问的问题。 您的示例的查询将提供问题的答案“所有姓氏是什么,以便存在具有该姓氏的用户?”。 如果您想问的问题是“有多少用户被命名为'Stone'”,那么您应该提交的查询是从last_name ='Stone'的用户中选择count(...); 投影总是“丢失”信息。与投射掉的属性相关联的信息。我没有看到有用的关系运算符的已知属性如何被解释为针对该运算符的参数。     
在RDBMS中,仅对姓氏列的关系投影将仅返回一组具有不同姓氏值的元组。没有重复的元组。 在SQL中,除非您指定了DISTINCT关键字,否则您将获得重复项。那是因为SQL不是真正的关系语言 - 除其他外,因为SQL表和表表达式不是正确的关系。 SQL DBMS不是RDBMS。     
“理想的RDBMS应该回归什么?” 正如大卫所说,它应该返回(在你的例子中)一行。 如果SQL DBMS将每个SELECT视为请求SELECT DISTINCT,则它只是一个关系型DBMS。 (但也有一些微小的附加条件也要满足。) 这样做的原因是该单行的“含义”如下:“存在一些用户,他有一个first_name,他有一个ID,他的last_name是'Stone'”。 永远不需要第二次重复该陈述。你要求的权威性参考是Ted Codd本人:“如果事情是真的,那么说两次就不会让它变得更真实。”     
我不确定我发现返回值有问题。有三个记录包含Stone3ѭ的“石头”。如果查询中包含
FIRST_NAME
ID
,这将是显而易见的,但事实并非如此。通常,
DISTINCT
关键字用于处理此问题并确保不会出现重复。 事实上,如果我的数据库开始自动应用
DISTINCT
(听起来你觉得它可能应该这样),我会有些恼火。在调试数据库中的一些奇怪的数据问题时,在您不期望的时候看到重复的行通常是需要的中断。     
我认为你的原始查询没有返回重复的行。它从数据库返回3个单独的数据行,其中只包含姓氏列。我会说你的问题没有正确表达,因此为什么RDBMS以他们的方式运作(我也认为这是正确的方式)。 翻译您的查询: 从USERS中选择LAST_NAME 英文,它将是: “告诉我所有用户的姓氏” 如果我进入高中体育课,并要求老师“使用你的班级名单,告诉我班上所有学生的姓氏”,如果班上有孪生兄弟,我会认为他会列出他们的最后一个名字两次(或者如果他应该,他至少会问你这个问题)。他只会从课堂上的人名单中读出他们的姓氏。 如果你想问这个问题,“班上学生的姓氏有什么不同”,他就不会列出重复的名字。然而,这就是“DISTINCT”关键词的存在。 所以查询将是: 从USERS中选择不同的LAST_NAME 如果你真的对英文中唯一姓氏的数量感兴趣,那就是“班上学生有多少不同的姓氏”或者使用你的例子: 从USERS中选择计数(不同的LAST_NAME) 然而: 从USERS中选择计数(LAST_NAME) 用英语表示: “班上有多少人姓?”     

要回复问题请先登录注册