Возвращает строку с уникальными значениями по столбцам одной и той же таблицы

#sql #sql-server #count #distinct #lateral-join

#sql #sql-сервер #количество #distinct #боковое соединение

Вопрос:

У меня есть такие данные:

код EMAIL0 EMAIL1 EMAIL2 EMAIL3 EMAIL4 EMAIL5 EMAIL6
ABC abc@gmail.com q@gmail.com q@gmail.com f@gmail.com h@gmail.com u@gmail.com y@gmail.com
DEF def@gmail.com k@gmail.com NULL NULL NULL NULL g@gmail.com
XYZ xyz@gmail.com i@gmail.com i@gmail.com NULL NULL NULL NULL

Мне нужно, чтобы запрос возвращал только вторую строку с CODE=DEF , потому EMAIL1 EMAIL6 что все это уникальные значения.

В основном мне нужны строки с уникальными значениями для EMAIL1 to EMAIL6 . Здесь CODE всегда будет уникальным.

Я пытался, CROSS JOIN но это не сработало.

Комментарии:

1. Вам действительно следует исправить свой дизайн, наличие 6 столбцов электронной почты нарушает один из основных преципитатов 3NF.

Ответ №1:

Если вам нужны строки, в которых электронные письма не повторяются, вы можете открепить электронные письма от строк в боковом соединении, а затем сравнить количество отдельных null значений, не являющихся значениями, с количеством значений, не являющихся значениями null :

 select t.*
from mytable t
cross apply (
    select count(distinct email) cnt1, count(email) cnt2
    from (values (email0), (email1), ...) as x(email)
) x
where x.cnt1 = x.cnt2
 

Комментарии:

1. Я не могу получить правильный синтаксис запроса. Я заменил mytable приведенного выше запроса на свое фактическое имя таблицы, но не могу написать полный запрос.

2. @jayeshkshirsagar: какой запрос вы выполняете и какую именно ошибку вы получаете?

3. Я написал следующий запрос:

4. Я написал следующий запрос: предположим, я пока принимаю электронные письма 1 и Email2.. В последнем запросе мне нужно сравнить Email1 с Email6.. Не должно быть дубликатов в 1-6 select t.* из QUALIFIED_UNIQUE_EMAIL_R t перекрестное применение ( выберите count(distinct email_1) cnt1, count(email_2) cnt2 из (значения (email_1), (email_2)) как x(email) ) x где x.cnt1 = x.cnt2 Ошибка:Сообщение 4101, уровень 15, состояние 1, строка 252 Агрегаты в правой части приложения не могут ссылаться на столбцы с левой стороны.

5. @jayeshkshirsagar: select count(distinct email_1) cnt1, count(email_2) cnt2 должно быть select count(distinct email) cnt1, count(email) cnt2 , как в моем запросе.