Главная Новые темы Список тем Задать вопрос Поиск  

Форум "DataBase и SQL"


Язык запросов баз даных


 #0 VictorT © 01.08.06 10:42:06 - 04.08.06 13:56:07

Сравнение результатов двух запросов



Как еффективно проверить, что 2 запроса возвращают одинаковый набор данных (одно и то же кол-во строк, одни и те же значения полей, в общем, всё одно и то же).

Запросы типа таких:

select  item_id, store_id, quantity from tbl_invoice_reserv where invoice_id=1154346284 order by item_id, store_id

select  item_id, store_id, item_quantity as quantity from tbl_sales_items_details where invoice_id=1154346284 order by item_id, store_id

У меня есть несколько вариантов, но хотелось бы услышать, что предложите вы, т.к. мои мне не очень нравятся (за исключением одного). Цитата

 #1 VictorT © 01.08.06 11:43:13

Пока останавливаюсь на таком варианте - выполняем два запроса и сравниваем результаты:

select  count(*) from tbl_invoice_reserv where invoice_id=1154346284

select count(*) from
(
select  item_id, store_id, quantity from tbl_invoice_reserv where invoice_id=1154346284
union
select  item_id, store_id, item_quantity as quantity from tbl_sales_items_details where invoice_id=1154346284
)
as union_table


Может кто ещё что-то предложит?
 #2 VictorT © 01.08.06 11:58:51

ошибся, тут ещё нужен третий запрос
select  count(*) from tbl_sales_items_details where invoice_id=1154346284
 #3 Go © 01.08.06 12:18:39

хм.. а может нагляднее это лефт_джойнами делать !?
 #4 VictorT © 01.08.06 12:34:17

>#3 Go ©
думал и об этом, но тут вдруг увидел, что у меня уже _изначально_ есть инфа о кол-ве записей для "первого" и "третьего" запросов, таким образом, мне нужно выполнить только один, "второй" запрос (с union), и то только в случае, если совпадает инфа о кол-ве записей для "первого" и "третьего" запроса.
 #5 Andrey © 04.08.06 13:56:07

Таксь... ну если сервер поддерживает full outer join, то можно так (id - поле с реквизитом not null или просто то поле которое должно быть заполнено):

select a.id, b.id
 from tbl_invoice_reserv a outer join tbl_invoice_reserv b on (b.список полей  для сравнения = a.список полей для сравнения)
where a.invoice_id=1154346284
  and b.invoice_id=1154346284
  and (a.id is null or b.id is null)

если сей запрос вернет 1+ строк, значит множества a.invoice_id=1154346284 не равно множеству b.invoice_id=1154346284 по критерию определенному в условии джоина.


Если сервер не поддерживает full outer join (Оракл например не поддерживает), то его можно сэмулироать с помощью комбинации
select ... left join
union
select ... right join




  • Написать ответ

    Имя: Регистрация HTML?
    smiles смайлики
    Потом перейти в:    
    паутина



      ©  webest.net, 2002-2007  

    top.mail.ru
    » Бесплатный счетчик посещений
    » Рейтинг сайтов