Как найти совпадающие записи, сравнивающие одно поле в таблице с несколькими полями в другой таблице? - PullRequest
1 голос
/ 15 июня 2011

Используя 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));

1 Ответ

2 голосов
/ 15 июня 2011

У вас есть пара вариантов

Использование DISTINCT / JOIN

SELECT DISTINCT v.folio, 
                v.[PID Number1], 
                v.[PID Number2], 
                v.[PID Number3] 
FROM   [760Vadim] v 
       INNER JOIN no_dupes nd 
         ON nd.pid LIKE v.[PID Number1] 
             OR nd.pid LIKE v.[PID Number2] 
             OR nd.pid LIKE v.[PID Number3] 

Использование DISTINCT / EXISTS

SELECT DISTINCT 
       v.folio, 
       v.[PID Number1], 
       v.[PID Number2], 
       v.[PID Number3] 
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] )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...