Проверьте отношение один к одному между двумя столбцами - PullRequest
0 голосов
/ 13 июня 2019

У меня есть два столбца, которые, как я подозреваю, содержат избыточную информацию - представьте аббревиатуру и полное имя, где аббревиатура и полное имя, вероятно, имеют отношение один к одному.Я хочу выяснить, существует ли отношение один-к-одному, и определить места, где оно не проверяется.

Я работаю с SQL Server, если это поможет.

Я посмотрел здесь .Однако это не совсем то, что мне нужно, поскольку, если у меня есть две копии одной и той же пары, он помечается.

То, что я хочу сделать, больше похоже на этот вопрос в Python ,Похоже, что все функциональные возможности доступны в SQL, но, поскольку есть и другие столбцы контекста, я хотел бы иметь возможность просматривать, где не хранятся отношения (это могут быть просто ошибки данных).

Например, эта таблица хороша:

col1 | col2 | context
1 | a | cont1
2 | b | cont2
3 | c | cont3
1 | a | cont4
3 | c | cont5

, потому что каждый 1 в столбце col1 соответствует 'a' и ничего больше, каждые 2 соответствует 'b' и т. Д. И каждый 'a' соответствует только '1 'и т. Д.

Эта таблица не годится:

col1 | col2 | context
1 | a | cont1
2 | b | cont2
3 | c | cont3
1 | b | cont4
3 | c | cont5

, поскольку 1 соответствует как' a ', так и' b '.В этом случае я хотел бы иметь какой-то способ указать, что 1-я, 2-я и 4-я строки являются проблематичными и должны получить ручную проверку.

На данный момент, я предполагаю, что нет никакихNULLS (я планирую разобраться с ними отдельно)

1 Ответ

2 голосов
/ 13 июня 2019

Вы можете получить плохие строки, используя агрегацию. Если я правильно понимаю:

select col1
from t
group by col1
having max(col2) <> min(col2);

Если вы хотите оригинальные строки, используйте exists:

select t.*
from t
where exists (select 1 from t t2 where t2.col1 = t.col1 and t2.col2 <> t.col2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...