Допустим, у меня есть следующий запрос.
SELECT ID, Email, ProductName, ProductModel FROM Products
Как я могу изменить его, чтобы он не возвращал повторяющиеся электронные письма?
Другими словами, когда несколько строк содержат одно и то же электронное письмо, я хочу, чтобы результаты включали только одну из этих строк (предпочтительно последнюю). Дубликаты в других столбцах должны быть разрешены.
Пункты как DISTINCT
и, GROUP BY
кажется, работают на целые строки. Так что я не уверен, как подойти к этому.
sql
sql-server
Джонатан Вуд
источник
источник
Ответы:
Если вы используете SQL Server 2005 или выше, используйте это:
РЕДАКТИРОВАТЬ: Пример с использованием предложения where:
источник
SELECT
нуждается вWHERE
состоянии. Я думаю, что номера строк будут назначены для всех строк в таблице. Этот синтаксис немного за мной. Есть ли шанс обновления, которое гарантировало бы одну строку с определенным адресом электронной почты, который соответствуетWHERE
условию?JOIN
s. Как только у меня естьJOIN
,ROW_NUMBER
возвращает гораздо более высокие значения, чем «1».Предполагается, что SQL Server 2005+ и ваше определение «последний» является максимальным PK для данного письма
источник
Когда вы используете,
DISTINCT
думайте об этом как о отдельной строке, а не столбце. Он вернет только те строки, столбцы которых не совпадают в точности.Запрос будет возвращать обе строки, потому что
ID
столбец отличается. Я предполагаю, чтоID
столбец являетсяIDENTITY
столбцом, который увеличивается, если вы хотите вернуть последний, я рекомендую что-то вроде этого:Функция
TOP 1
вернет только первую запись, упорядочив ее поID
убыванию, она вернет результаты с последней строкой первой. Это даст вам последнюю запись.источник
Вы можете сделать это с помощью функции GROUP BY
источник
SELECT id, max(email) AS email FROM tbl GROUP by email
. В SQL-сервере ВСЕ столбцы вSELECT
предложении должны быть в статистической функции. Это кусает меня каждый раз, когда я возвращаюсь.Для доступа вы можете использовать запрос SQL Select, который я представляю здесь:
Например, у вас есть эта таблица:
Cliente || NOMBRES || MAIL
888 || T800 ARNOLD || t800.arnold@cyberdyne.com
123 || ДЖОН КОННОР || s.connor@skynet.com
125 || Сара Коннор ||s.connor@skynet.com
И вам нужно выбрать только отдельные письма. Вы можете сделать это с этим:
SQL SELECT:
Вы можете использовать это, чтобы выбрать максимальный идентификатор, имя корреспондента для этого максимального идентификатора, вы можете добавить любой другой атрибут таким образом. Затем в конце вы помещаете отдельный столбец для фильтрации и группируете его только по последнему отдельному столбцу.
Это принесет вам максимальный идентификатор с соответствующими данными, вы можете использовать min или любые другие функции, и вы скопируете эту функцию для подзапросов.
Этот выбор вернет:
Cliente || NOMBRES || MAIL
888 || T800 ARNOLD || t800.arnold@cyberdyne.com
125 || Сара Коннор ||s.connor@skynet.com
Не забудьте проиндексировать выбранные столбцы, и отдельный столбец не должен содержать числовые данные в верхнем или нижнем регистре, иначе он не будет работать. Это будет работать только с одним заказным письмом. Удачного кодирования !!!
источник
Причина
DISTINCT
иGROUP BY
работа с целыми строками заключается в том, что ваш запрос возвращает целые строки.Чтобы помочь вам понять: попробуйте вручную написать, что должен возвращать запрос, и вы увидите, что в столбцах, не дублирующихся, не однозначно.
Если вам буквально все равно, что находится в других столбцах, не возвращайте их. Возвращение случайной строки для каждого адреса электронной почты кажется мне немного бесполезным.
источник
Попробуй это
источник
Попробуй это:
источник