我如何编写一个SQL语句,证明函数依赖A→B在给定与ABCD属性的关系时保持不知道没有记录有NULL值?
答案 0 :(得分:7)
SELECT * from R r1, R r2 where r1.A=r2.A and r1.B <> r2.B
如果FD持有,这应该返回一个空集。
答案 1 :(得分:2)
从顶部开始,这不一定是SQL查询。适当的database normalization解决了功能依赖的问题,特别是在考虑第二和第三范式时。如果您尝试在单个实体中发现功能依赖项,则可能需要分解其属性并修改架构。
如果您仍然希望动态证明直接的函数依赖性,请构造一个满足functional dependence:
定义的查询在给定的表中,当且仅当每个X值与恰好一个Y值相关联时,属性Y被称为对一组属性X(写入X→Y)具有功能依赖性。例如,在包含“员工ID”和“员工出生日期”属性的“员工”表中,功能依赖性{员工ID}→{员工出生日期}将保留。
您可以通过选择A和B来证明弱功能依赖性,然后确定是否相对于另一个重复。
为此,请构建查询:SELECT UNIQUE A,B FROM ABCD;
。当且仅当A在集合内重复时,重复唯一集合{A,B}中的元素才能证明函数依赖性A→B。如果A在一个足够大的数据集中没有相对于B重复,那么可以说B在功能上弱于A。换句话说,“我们没有反证功能依赖,我们有一个引人注目的统计论点,可能是直接或传递的情况。“
做得比这更好的是确定有关被检查实体的其他信息。如果你能做到这一点,请参考我上面关于规范化的原始建议。
答案 2 :(得分:0)
您还可以根据要检查的功能依赖性(在本例中为A-> B)分组,并计算每个A是否有不同的B。
SELECT *
FROM R
GROUP BY A
HAVING COUNT (DISTINCT B) > 1;
如果要检查A-> B,C是否可以扩展查询:
SELECT *
FROM R
GROUP BY A
HAVING COUNT (DISTINCT B) > 1 OR COUNT (DISTINCT C)>1;