Microsoft Access не может удалить дубликаты, содержащие нулевое значение - PullRequest
1 голос
/ 07 февраля 2012

У меня проблемы с удалением / поиском дубликатов, когда значение в определенном столбце содержит нулевое значение

Это были мои первоначальные критерии

    In (SELECT [PQT] FROM [Departure] As Tmp GROUP BY [PQT],[IDNUSER],[Name]
    HAVING Count(*)>1  And [IDNUSER] = [Departure].[IDNUSER] And [Name] = [Departure].[Name])

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

Я пытался заменить его на

And IIf(IsNull([Name]), " ", [Name]) = IIf(IsNull([Departure].[Name]), " ",
[Departure].[Name])

Кажется, это не сработало. Я также пытался использовать NZ, но безуспешно

Вот пример данных, которые моя таблица будет содержать

**PQT**     **IDNUSER**      **Name**  
BNC          001              Bob  
BNC          001              Bob
BNC          002              
BNC          002              

Результаты моего текущего запроса Первые 2 данные с IDNUSER 001 рассматриваются как дубликаты, поскольку все поля имеют значения. но IDNUSER 002 не будет считаться дубликатом, поскольку значение в имени равно нулю. Я хотел бы, чтобы мой запрос нашел все дубликаты.

1 Ответ

3 голосов
/ 08 февраля 2012

Используя ваши образцы данных для таблицы отправлений, это вывод следующего запроса SELECT.

PQT IDNUSER user_name num_matches
BNC 001     Bob                 2
BNC 002                         2

SELECT
    d.PQT,
    d.IDNUSER,
    Nz([Name]," ") AS user_name,
    Count(*) AS num_matches
FROM Departure AS d
GROUP BY
    d.PQT,
    d.IDNUSER,
    Nz([Name]," ");

Однако в вашем вопросе упоминалось удаление дубликатов, поэтому я не знаю, что еще нужно сделать на этом этапе. Я не понимаю, как вы можете различить 2 ряда Боба ... какой из них отбросить, а какой оставить. Это было бы возможно, если бы у нас был уникальный столбец (например, первичный ключ), чтобы различать их. В качестве альтернативы вы можете сохранить выходные данные этого запроса GROUP BY в другой таблице с помощью пользовательского интерфейса Access, который называется «запрос на добавление». Шаблон для такого запроса будет выглядеть примерно так:

INSERT INTO OtherTable (
    PQT,
    IDNUSER,
    user_name,
    num_matches
    )
SELECT
    d.PQT,
    d.IDNUSER,
    Nz([Name]," ") AS user_name,
    Count(*) AS num_matches
FROM Departure AS d
GROUP BY
    d.PQT,
    d.IDNUSER,
    Nz([Name]," ");

Обратите внимание, что я объединил две строки с IDNUSER = 002 в одну строку. Это было мое лучшее предположение о том, что вы хотели. Однако я склоняюсь к тому, чтобы требовать значения в столбце «Имя» - другими словами, запретить Null. Но если вам нужно разрешить значения Null и обрабатывать их по-другому, скажите нам, что вы хотите.

Редактировать : Глядя на это снова, я не вижу реальной необходимости в функции NZ (). Эта версия правильно подсчитывает совпадения, даже если в группах указано значение Null для [Имя].

SELECT
    d.PQT,
    d.IDNUSER,
    [Name] AS user_name,
    Count(*) AS num_matches
FROM Departure AS d
GROUP BY
    d.PQT,
    d.IDNUSER,
    [Name];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...