Проверка идентичности содержимого двух таблиц в MySQL - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть представления в двух базах данных V1 и V2 с одинаковым набором столбцов col1, col2.

Теперь я хотел бы знать, содержат ли они одинаковые строки. В этом контексте я прошел этот пост: SQL сравнить данные из двух таблиц .

После этого я выполняю следующий запрос:

  select * from v1.A
  minus
  select * from v2.A;

Но Я получаю сообщение об ошибке ниже:

 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select * from v2.A' at line 3

Я не получаю никакой информации о том, как исправить эту ошибку.

1 Ответ

1 голос
/ 04 апреля 2020

Вы можете смоделировать minus, который не поддерживается в MySql с NOT EXISTS:

select t1.* from v1.A t1
where not exists (
  select * from v2.A t2
  where t2.col1 <=> t1.col1 and t2.col2 <=> t1.col2
)

Я использую NULL-безопасный оператор равенства <=> вместо просто = на всякий случай есть null s, которые необходимо сравнить. Но если этот запрос не возвращает никаких результатов, это не означает, что 2 представления возвращают одинаковые строки, поскольку v1.A может возвращать подмножество строк, возвращаемых v1.B. Так что вам также нужно:

select t2.* from v2.A t2
where not exists (
  select * from v1.A t1
  where t2.col1 <=> t1.col1 and t2.col2 <=> t1.col2
)

и, возможно, лучше UNION ALL из 2 запросов, чтобы быть уверенным:

select 1 from_view, t1.* from v1.A t1
where not exists (
  select * from v2.A t2
  where t2.col1 <=> t1.col1 and t2.col2 <=> t1.col2
)
union all
select 2 from_view, t2.* from v2.A t2
where not exists (
  select * from v1.A t1
  where t2.col1 <=> t1.col1 and t2.col2 <=> t1.col2
)
...