Оператор SQL, чтобы доказать, что A-> B в R (ABCD) - PullRequest
2 голосов
/ 04 декабря 2010

Как мне написать оператор SQL, который доказывает функциональную зависимость A → B, имеющую отношение с атрибутами ABCD, зная, что ни одна запись не имеет значений NULL?

Ответы [ 3 ]

7 голосов
/ 16 апреля 2013
SELECT * from R r1, R r2 where r1.A=r2.A and r1.B <> r2.B

Это должно вернуть пустой набор, если удерживается FD.

2 голосов
/ 04 декабря 2010

Начиная сверху, это не обязательно должен быть запрос SQL.Вопрос о функциональной зависимости решается путем правильной нормализации базы данных , особенно при рассмотрении второй и третьей нормальной формы.Если вы пытаетесь обнаружить функциональные зависимости внутри одной сущности, вы можете разложить ее атрибуты и пересмотреть свою схему.

Если вы все еще хотите доказать прямую функциональную зависимость на лету, создайте запроскоторый удовлетворяет определению функциональной зависимости:

В данной таблице говорят, что атрибут Y имеет функциональную зависимость от набора атрибутов X (записано X → Y)тогда и только тогда, когда каждое значение X связано только с одним значением Y.Например, в таблице «Сотрудник», которая содержит атрибуты «Идентификатор сотрудника» и «Дата рождения сотрудника», будет сохраняться функциональная зависимость {Идентификатор сотрудника} → {Дата рождения сотрудника}.

Вы можете доказать слабую функциональную зависимость, выбрав для A и B, а затем определив, повторяется ли одно относительно другого.

Для этого создайте запрос: SELECT UNIQUE A,B FROM ABCD;.Повторяющиеся элементы в уникальном наборе {A, B} опровергают функциональную зависимость A → B тогда и только тогда, когда A повторяется в пределах набора.Если A не повторяется относительно B в достаточно большом наборе данных, можно сказать, что B слабо функционально зависит от A. Другими словами, «у нас нет опровергнутой функциональной зависимости, и мы имеемубедительный статистический аргумент, что это может иметь место прямо или транзитивно. "

Чтобы добиться большего, чем это, нужно определить дополнительную информацию о проверяемой организации.Если вы можете сделать это, обратитесь к моему первоначальному совету о нормализации выше.

0 голосов
/ 10 февраля 2019

Вы также можете сгруппировать по функциональной зависимости, которую хотите проверить (в данном случае A-> B), и посчитать, есть ли отдельные B для каждого A.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...