Как сравнить два результата запроса на равенство в MySQL? - PullRequest
7 голосов
/ 08 июля 2011

Я пользователь MySQL.У меня есть два запроса, и я хочу сравнить их результаты на равенство .Я хотел бы сделать это с одним запросом, который вернул бы true или false, поэтому каждый из моих двух запросов, скорее всего, принял бы форму подзапросов.

Я бы хотел не возвращать результаты обоихзапросы и сравнение их на уровне приложений, чтобы сократить общение и повысить производительность.Я также хотел бы избегать зацикливания результатов на уровне базы данных, если это возможно, но если нет другого пути, пусть будет так.

Я искал пример того, как это сделать, но все же, нопришли с пустыми руками.Некоторые примеры кода были бы очень признательны, потому что я новичок в программировании на SQL.Спасибо!

Примечание: Я ищу решение, которое бы работало с любыми двумя произвольными запросами, поэтому я воздержусь от публикации того, что происходит с моими двумя запросами.

Ответы [ 3 ]

13 голосов
/ 08 июля 2011
SELECT
  CASE WHEN count1 = count2 AND count1 = count3 THEN 'identical' ELSE 'mis-matched' END
FROM
(
  SELECT
    (SELECT COUNT(*) FROM <query1>) AS count1,
    (SELECT COUNT(*) FROM <query2>) AS count2,
    (SELECT COUNT(*) FROM (SELECT * FROM query1 UNION SELECT * FROM query2) AS unioned) AS count3
)
  AS counts
3 голосов
/ 08 июля 2011

Вы не можете сделать MINUS в MySQL, поэтому вот как это сделать без:

select if(count(*)=0,'same','different') from (
select col1,col2,col3
from tableone
where ( col1, col2, col3 ) not in
( select col4, col5, col6
  from tabletwo )
union
select col4, col5, col6
from tabletwo
where ( col4, col5, col6 ) not in
( select col1, col2, col3
  from tableone )
) minusintersec;

Это дано:

tableone (col1 integer, col2 integer, col3 integer );

tabletwo (col4 integer, col5 integer, col6 integer );
3 голосов
/ 08 июля 2011

Это было бы немного проще, если бы MySQL поддерживал FULL OUTER JOIN, также обратите внимание, что, если два запроса дают одинаковые результаты, но в разном порядке, это будет считаться эквивалентным

SELECT 
  COUNT(*) 
FROM 
(
    (SELECT A, b, c FROM A) a
    LEFT OUTER JOIN 
      (SELECT A, b, c FROM b) B
    ON A.a = b.a and a.b = b.b and a.c = b.c
UNION 
    (SELECT A, b, c FROM A) a
   RIGHT OUTER JOIN 
   (SELECT A, b, c FROM b) B
    ON A.a = b.a and a.b = b.b and a.c = b.c
) 
WHERE a.a is null or b.a is null

Если количество = 0тогда два запроса одинаковы

Кроме того, поскольку я использую UNION, удаляются дубликаты.Так что там есть потенциальная неточность.

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