如何编写SQL查询判断关系R中(a,b)→c函数依赖是否成立?
问题描述
给定包含属性a、b、c的非空关系表R,编写SQL查询:当函数依赖a, b → c被表满足时,返回仅含值’True’的结果表;若不满足,查询结果为空。
示例:
当表R数据如下:
a b c -- -- -- 20 15 10 20 15 10
查询输出应为:
value ----- True
解决方案
要验证函数依赖a, b → c是否成立,核心是检查是否存在同一组(a,b)对应多个不同的c值。如果不存在这种情况,依赖成立,返回'True';反之返回空结果。
方法一:分组验证法
SELECT 'True' AS value WHERE NOT EXISTS ( SELECT a, b FROM R GROUP BY a, b HAVING COUNT(DISTINCT c) > 1 );
- 子查询逻辑:按(a,b)分组后,统计每组内不同c值的数量。如果某组的
COUNT(DISTINCT c) > 1,说明该(a,b)对应多个c值,违反了函数依赖。 - 外层查询:当子查询无结果返回(即没有违反依赖的分组),就输出'True';否则不返回任何数据。
方法二:唯一组合数对比法
SELECT 'True' AS value WHERE ( SELECT COUNT(DISTINCT a, b) FROM R ) = ( SELECT COUNT(DISTINCT a, b, c) FROM R );
- 逻辑说明:如果每个(a,b)对应唯一的c值,那么(a,b,c)的唯一组合数必然等于(a,b)的唯一组合数。两者相等时,函数依赖成立,返回'True'。
内容的提问来源于stack exchange,提问作者John Young
相关产品推荐
相关产品推荐

