#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
, как в моем запросе.