给定数据库架构: [表的主键以粗体显示) 帐户( account_no ,branch_name,余额) 存款人(customer_name,account_number){这里没有说明密钥} 客户(的 CUSTOMER_NAME 下,customer_street,customer_city)
编写SQL查询所需的问题 - 查找居住在哈里森并拥有至少3个帐户的每位客户的平均余额。
我编写了以下SQL查询:
select depositor.customer_name,avg(balance)
from depositor,account,customer
where depositor.account_number=account.account_number and
depositor.customer_name=customer.customer_name and
customer_city='Harrison'
group by depositor.customer_name
having count(depositor.account_number) >=3
我的教科书提到查询为:
select depositor.customer_name,avg(balance)
from depositor,account,customer
where depositor.account_number=account.account_number and
depositor.customer_name=customer.customer_name and
customer_city='Harrison'
group by depositor.customer_name
having count( distinct depositor.account_number) >=3
在这里放置不同会导致结果发生变化吗? 根据我的分析,结果关系(存款人账户客户)的交叉产品将具有候选密钥 customer_name account_number 如此不同,此处不会添加任何值。
答案 0 :(得分:1)
depositor
表似乎存储了customer_name
和account_number
的唯一组合,这意味着在计数中添加DISTINCT不会产生任何影响。
但如果该表是一个具有相同account_number
重复实例的事实表,那么您不希望两次计算相同的帐号,在这种情况下,它会有所不同。
但在你的情况下,它应该没有区别,因为其他两个表似乎也包含各自字段的唯一组合。
答案 1 :(得分:0)
由于存款人表没有主键约束,因此可以复制名称 - 帐户配对。您的教科书可能没有讨论过复合键,因此这可能是一种捕捉该场景的方法。不幸的是,尽管获得三个账户资格是正确的,额外的行仍然会抛弃平均计算。