![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сравнение результатов двух запросов [MySQL]
VictorT © (2006-08-01 11:45:00)Как еффективно проверить, что 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
У меня есть несколько вариантов, но хотелось бы услышать, что предложите вы, т.к. мои мне не очень нравятся (за исключением одного).
SergP. (2006-08-07 12:04:00) [1]> [2] Сергей М. © (01.08.06 11:50)
> Сохрани оба НД в стрим (каждый в свой) и сравни размер и
> бинарное содержимое стримов на совпадение.
Ну это прокатит если значение этих полей item_id, store_id вместе будут уникальные....
VictorT (2006-08-04 11:02:00) [2]
> судя по [10] запрос из запроса есть,
есть, но только именно в такой форме, как в [10], с альясом, когда результат запроса обзывают таблицей.
Danilka (2006-08-02 09:00:00) [3]опс, точнее так:
select item_id, store_id, quantity from tbl_invoice_reserv t1 where invoice_id=1154346284
and not exists (select 1 from tbl_sales_items_details t2 where t2.invoice_id=1154346284 and t2.item_id = t1.item_id and t2.store_id = t1.store_id and t1.quantity = t2.item_quantity)
:)
Danilka (2006-08-02 09:00:00) [4][18] Romkin © (01.08.06 16:30)
судя по [10] запрос из запроса есть, так что такой вариант (доработаный, чтоб учитывал дубли и таблицы местами поменять) тоже имеет место быть:
select item_id, store_id, quantity from tbl_invoice_reserv t1 where invoice_id=1154346284
where not exists (select 1 from tbl_sales_items_details t2 where t2.invoice_id=1154346284 and t2.item_id = t1.item_id and t2.store_id = t1.store_id and t1.quantity = t2.item_quantity)
Romkin (2006-08-01 16:36:00) [5]А если просто на совпадение, то вполне пойдет
select TableA.*
from TableA left outer join TableB on (TableA.col1 = TableB.col1)
where TableB.col1 is NULL
UNION
select TableB.*
from TableB left outer join TableA on (TableB.col1 = TableA.col1)
where TableA.col1 is NULL
Тут, конечно, подразумеваются одинаковые поля в обеих таблицах. Если они совпадают - результат пустой. Фактически в первом запросе берутся все значения, которых нет во второй таблице, во втором - наоборот.
Еще условие - col1 в обеих таблицах не должно принимать пустых значений (быть объявленным как col1 not NULL), иначе фокус не получится. :)
Romkin (2006-08-01 16:30:00) [6]Вообще говоря, в SQL сравнить можно две таблицы на схожесть строк, но никак не полей, поля должны быть :)
Вообще говоря, запрос для EXCEPT прост:
select distinct col1 from TableA
where not exists (select * from TableB
where TableA.col1 = TableB.col1)
Но вот насчет подзапроса в MySQL сомнения тревожат :)
А view есть?
Sergey13 (2006-08-01 13:26:00) [7]> Либо в нём меньше записей, но те, что есть, совпадают с
> первым.
Логично. Про это я не подумал.
VictorT (2006-08-01 13:23:00) [8]
> по большому счету
> он лишний.
Я тоже вначале подумал.
> Раз не добавил записей в суумирующий, то он равен
> первому.
Либо в нём меньше записей, но те, что есть, совпадают с первым.
Sergey13 (2006-08-01 13:18:00) [9]2 [13] VictorT © (01.08.06 13:04)
> З.Ы. А я забыл ещё про третий запрос:
> select count(*) from tbl_sales_items_details where invoice_id=1154346284
Для очистки совести можно и его, но по большому счету он лишний. Раз не добавил записей в суумирующий, то он равен первому.
Сергей М. (2006-08-01 13:12:00) [10]Если так, то тем более.
VictorT (2006-08-01 13:04:00) [11]
> * на item_id замени. Я не юзал мускул, но хуже точно
> не будет.
ок.
> На distinct обрати внимание.
distinct для union по дефолту, если не ошибаюсь.
З.Ы. А я забыл ещё про третий запрос:
select count(*) from tbl_sales_items_details where invoice_id=1154346284
Сергей М. (2006-08-01 12:58:00) [12]
> VictorT © (01.08.06 12:43) [10]
На distinct обрати внимание.
Число записей в любом из исходных НД и число записей в
select distinct * from (union-запрос)
должно совпадать, если НД идентичны
Sergey13 (2006-08-01 12:47:00) [13]> [10] VictorT © (01.08.06 12:43)
* на item_id замени. Я не юзал мускул, но хуже точно не будет.
VictorT (2006-08-01 12:43:00) [14]Пока останавливаюсь на таком варианте - выполняем два запроса и сравниваем результаты:
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
Может кто ещё что-то предложит?
VictorT (2006-08-01 12:16:00) [15]
> Плохиш © (01.08.06 12:13) [8]
Изначально предполагал, что вопрос будет касаться только самой СУБД, что от клиентской стороны можно абстрагироваться.
А вообще да, светлее, пока об этом не спрашивают.
Плохиш (2006-08-01 12:13:00) [16]
> VictorT © (01.08.06 12:03) [5]
НА форум PHP-программистов обратиться не пробовали или здесь светлее?
VictorT (2006-08-01 12:10:00) [17]
> Сергей М. ©
Скажем так, не у любого хостера это возможно.
Сергей М. (2006-08-01 12:09:00) [18]
> VictorT © (01.08.06 12:03) [5]
А что, PHP разве не позволяет подключать и использовать внешние библ.модули (в т.ч. и разработанные в Делфи) для обработки неких данных ? Я просто не в курсе ...
VictorT (2006-08-01 12:03:00) [19]
> Сергей М. ©
Ясно. Придётся мне оговориться, что у меня MySQL + PHP (не Delphi).
Сергей М. (2006-08-01 11:57:00) [20]
> что такое стрим?
Поток данных.
В твоем случае пусть это будет станд.класс TMemoryStream.
Разумеется, при условии что оба НД не слишком велики по объему данных.