Сравните 2 таблицы в MS Access на основе нескольких полей и получите новую таблицу со значениями, которые не содержатся в первой таблице - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь написать код SQL в MS Access, который мог бы сравнить несколько полей из 2 таблиц и создать новое со всеми значениями, где хотя бы одно поле из таблицы 2 не равно полю из таблицыодин.

t1:
ID personalID lastname   firstname   city   postcode street   houseNumber
1  1456       lastname01 firstname01 city01 4789     street01 46 
2  5783       lastname02 firstname02 city02 1239     street02 21
3  1698       lastname03 firstname03 city03 6578     street03 98

t2:
ID personalID lastname   firstname   city   postcode street   housenumber 
2  5783       lastname02 firstname02 city99 1593     street99 29
3  1698       lastname03 firstname03 city03 6578     street03 98
4  2517       lastname04 firstname04 city04 7321     street04 7

ожидаемый результат:

ID personalID lastname   firstname   city   postcode street   housenumber 
2  5783       lastname02 firstname02 city99 1593     street99 29
4  2517       lastname04 firstname04 city04 7321     street04 7

в 2: новый адрес (новый почтовый индекс города, улица и номер дома)

в 4: новое поле

Обе таблицы связаны с помощью идентификационной клавиши.

Мой код:

SELECT
    *
FROM
    t2
    RIGHT JOIN t2
    ON
               t2.personalID = t1.personalID
        AND    t2.city = t1.city
        AND    t2.postcode = t1.postcode
        AND    t2.street = t1.street
        AND    t2.houseNumber = t1.houseNumber
WHERE
          t2.personalID IS NULL
    OR    t2.city IS NULL
    OR    t2.postcode IS NULL
    OR    t2.street IS NULL
    OR    t2.houseNumber IS NULL; 

Ошибка: ошибка синтаксиса в операции JOIN

Я полагаю, что операция RIGHT JOIN правильная, так как я хочу соединить t2 с t1 (но только показать значения в t2), но я не уверен, что оператор AND или OR правильный (в случае, если personalID существует в обеих таблицах, нотолько некоторые поля (например, улица) были изменены).

Заранее спасибо за помощь.

Ответы [ 2 ]

3 голосов
/ 07 октября 2019

Почему бы не использовать not exists?

SELECT t2.*
FROM t2
WHERE NOT EXISTS (SELECT 1
                  FROM t1
                  WHERE t2.personalID = t1.personalID AND
                        t2.city = t1.city AND
                        t2.postcode = t1.postcode AND
                        t2.street = t1.street AND
                        t2.houseNumber = t1.houseNumber
                 );

Это стандартный SQL, который должен работать в любой базе данных, даже в MS Access.

Примечание. Он не учитывает значения NULL. как равныйВы можете настроить логику, если хотите принять это во внимание.

2 голосов
/ 07 октября 2019

Синтаксис MS Access отличается от синтаксиса SQL Server. Попробуйте это:

SELECT t2.*
FROM
      t2 LEFT JOIN t1 ON (t2.city = t1.city)
  AND (t2.postcode = t1.postcode)
  AND (t2.street = t1.street)
  AND (t2.houseNumber = t1.houseNumber)
  AND (t2.personalID = t1.personalID)
WHERE (((t1.ID) Is Null));

ps Я бы предпочел использовать визуальный конструктор в MS Access для выполнения таких запросов

pps Ваш код не будет иметь синтаксической ошибки, как это (у вас была опечатка - t2RIGHT JOIN t2):

SELECT
    *
FROM
    t2
    RIGHT JOIN t1
    ON
               t2.personalID = t1.personalID
        AND    t2.city = t1.city
        AND    t2.postcode = t1.postcode
        AND    t2.street = t1.street
        AND    t2.houseNumber = t1.houseNumber
WHERE
          t2.personalID IS NULL
    OR    t2.city IS NULL
    OR    t2.postcode IS NULL
    OR    t2.street IS NULL
    OR    t2.houseNumber IS NULL; 

, но результаты этого запроса отличаются от вашего описанного результата, и вариант с t2 LEFT JOIN t1 работает, как вы упомянули

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...