Используя MS Access 2010, у меня есть две таблицы, в которых я хочу найти совпадающие записи в одной из них, сравнивая похожие поля (1: 1 и 1: M).
Таблица 1, [760Vadim]имеет четыре поля: Folio, PID Number1, PID Number2, PID Number3
Таблица 2, [no_dupes] имеет два поля: Folio, PID
Мне нужно найти все записи в [760Vadim], которыеиметь совпадающее значение из аналогичных полей в [no_dupes].
Сравнение полей Folio - это соединение 1: 1, тогда как сравнение PID - 1: M (1: 3), и оба они должны сравниваться нав то же время!
Я пробовал это с помощью Join и следующих операторов SQL:
1.) Работает, но только для одного поля за раз!
SELECT [760Vadim].*, no_dupes.PID
FROM no_dupes INNER JOIN 760Vadim ON no_dupes.PID = [760Vadim].[PID Number1]
WHERE (((no_dupes.PID) Like [760Vadim].[PID Number1]));
2.) Не работает при сравнении PID с двумя полями, возвращается 0 записей ...!
SELECT [760Vadim].*, no_dupes.PID
FROM no_dupes INNER JOIN 760Vadim ON (no_dupes.PID = [760Vadim].[PID Number2]) AND (no_dupes.PID = [760Vadim].[PID Number1])
WHERE (((no_dupes.PID) Like [760Vadim].[PID Number1])) OR (((no_dupes.PID) Like [760Vadim].[PID Number2]));
3.) Этот вид работает ... но возвращает дубликаты ... и возвращается вв конструктивном представлении он говорит недопустимый оператор из-за изменения И на ИЛИ, поэтому ему не нравится знак my = *
SELECT [760Vadim].*, no_dupes.PID
FROM no_dupes INNER JOIN 760Vadim ON (no_dupes.PID = [760Vadim].[PID Number2]) OR (no_dupes.PID = [760Vadim].[PID Number1])
WHERE (((no_dupes.PID) Like [760Vadim].[PID Number1])) OR (((no_dupes.PID) Like [760Vadim].[PID Number2]));
Также триed другие форумы предложения: 1.) Работает (я думаю ...), но дублирует снова!
SELECT [760Vadim].*
FROM 760Vadim, no_dupes
WHERE ((([760Vadim].folio)=[no_dupes].[DATA_SO1])) OR ((([760Vadim].[PID Number1])=[no_dupes].[PID])) OR ((([760Vadim].[PID Number2])=[no_dupes].[PID])) OR ((([760Vadim].[PID Number3])=[no_dupes].[PID]));
Кажется, что он проходит и возвращает запись, если совпадение найденодля фолио AND возвращает другую запись (может быть дубликатом), если в трех других полях найден соответствующий PID.
С аналогичный вопрос предлагается использовать функцию CONCAT внутрисоединения, чтобы удалить дубликаты.
Я также попытался добавить: GROUP BY [760Vadim].*;
после оператора where для удаления дубликатов, но безрезультатно, он говорит, что не может группировать ВСЕ записи, что мне и нужно.Я новичок в Access, но немного знаком с SQL ( основы ).
Извинения, если размещены в неправильном стеке, может лучше сидеть в Программистах или Обмене стеками баз данных?
РЕДАКТИРОВАТЬ: Я попробовал вариант без объединения как:
SELECT DISTINCT v.*
FROM [760Vadim] v
WHERE
EXISTS(SELECT * FROM no_dupes nd
WHERE nd.pid LIKE v.[PID Number1]
OR nd.pid LIKE v.[PID Number2]
OR nd.pid LIKE v.[PID Number3]
OR nd.folio LIKE v.[folio] )
Опция, которую вы предоставили, возвращает только четыре столбца из таблицы 760Vadim, желательно видеть ВСЕ из них.Я также заметил, что он не сравнивал поля фолио (эта спецификация потеряна в моем наборе, извините).
Правильно ли я отформатировал его для SELECT DISTINCT
всех столбцов в 760Vadim, если в no_dupes найдено совпадение?
Когда я возвращаюсь в представление SQL / design, он выдает ошибку исключения и изменяет SQL на:
SELECT DISTINCT v.* INTO query_final
FROM 760Vadim AS v
WHERE (((Exists (SELECT * FROM no_dupes nd
WHERE nd.pid LIKE v.[PID Number1]
OR nd.pid LIKE v.[PID Number2]
OR nd.pid LIKE v.[PID Number3]
OR nd.folio LIKE v.[folio] ))<>False));