Форум: "Базы";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];
ВнизСравнение результатов двух запросов Найти похожие ветки
← →
VictorT © (2006-08-01 11:45) [0]Как еффективно проверить, что 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
У меня есть несколько вариантов, но хотелось бы услышать, что предложите вы, т.к. мои мне не очень нравятся (за исключением одного).
← →
Sergey13 © (2006-08-01 11:49) [1]MINUS в мускуле не прокатывает? Если нет, то можно попробовать сравнить количество записей в отдельном запросе и в суммарном (через UNION без ALL). Если НД одинаковый, то количество записей должно совпадать.
← →
Сергей М. © (2006-08-01 11:50) [2]Сохрани оба НД в стрим (каждый в свой) и сравни размер и бинарное содержимое стримов на совпадение.
← →
VictorT © (2006-08-01 11:54) [3]
> MINUS в мускуле не прокатывает?
Не-а, если я правильно понял, планируется в следующих версиях.
> Если нет, то можно попробовать сравнить количество
> записей в отдельном запросе и в суммарном (через UNION
> без ALL). Если НД одинаковый, то количество записей
> должно совпадать.
что-то вроде этого у меня как раз и крутилось в голове.
> Сохрани оба НД в стрим
А что такое стрим?
← →
Сергей М. © (2006-08-01 11:57) [4]
> что такое стрим?
Поток данных.
В твоем случае пусть это будет станд.класс TMemoryStream.
Разумеется, при условии что оба НД не слишком велики по объему данных.
← →
VictorT © (2006-08-01 12:03) [5]
> Сергей М. ©
Ясно. Придётся мне оговориться, что у меня MySQL + PHP (не Delphi).
← →
Сергей М. © (2006-08-01 12:09) [6]
> VictorT © (01.08.06 12:03) [5]
А что, PHP разве не позволяет подключать и использовать внешние библ.модули (в т.ч. и разработанные в Делфи) для обработки неких данных ? Я просто не в курсе ...
← →
VictorT © (2006-08-01 12:10) [7]
> Сергей М. ©
Скажем так, не у любого хостера это возможно.
← →
Плохиш © (2006-08-01 12:13) [8]
> VictorT © (01.08.06 12:03) [5]
НА форум PHP-программистов обратиться не пробовали или здесь светлее?
← →
VictorT © (2006-08-01 12:16) [9]
> Плохиш © (01.08.06 12:13) [8]
Изначально предполагал, что вопрос будет касаться только самой СУБД, что от клиентской стороны можно абстрагироваться.
А вообще да, светлее, пока об этом не спрашивают.
← →
VictorT © (2006-08-01 12:43) [10]Пока останавливаюсь на таком варианте - выполняем два запроса и сравниваем результаты:
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
Может кто ещё что-то предложит?
← →
Sergey13 © (2006-08-01 12:47) [11]> [10] VictorT © (01.08.06 12:43)
* на item_id замени. Я не юзал мускул, но хуже точно не будет.
← →
Сергей М. © (2006-08-01 12:58) [12]
> VictorT © (01.08.06 12:43) [10]
На distinct обрати внимание.
Число записей в любом из исходных НД и число записей в
select distinct * from (union-запрос)
должно совпадать, если НД идентичны
← →
VictorT © (2006-08-01 13:04) [13]
> * на item_id замени. Я не юзал мускул, но хуже точно
> не будет.
ок.
> На distinct обрати внимание.
distinct для union по дефолту, если не ошибаюсь.
З.Ы. А я забыл ещё про третий запрос:
select count(*) from tbl_sales_items_details where invoice_id=1154346284
← →
Сергей М. © (2006-08-01 13:12) [14]Если так, то тем более.
← →
Sergey13 © (2006-08-01 13:18) [15]2 [13] VictorT © (01.08.06 13:04)
> З.Ы. А я забыл ещё про третий запрос:
> select count(*) from tbl_sales_items_details where invoice_id=1154346284
Для очистки совести можно и его, но по большому счету он лишний. Раз не добавил записей в суумирующий, то он равен первому.
← →
VictorT © (2006-08-01 13:23) [16]
> по большому счету
> он лишний.
Я тоже вначале подумал.
> Раз не добавил записей в суумирующий, то он равен
> первому.
Либо в нём меньше записей, но те, что есть, совпадают с первым.
← →
Sergey13 © (2006-08-01 13:26) [17]> Либо в нём меньше записей, но те, что есть, совпадают с
> первым.
Логично. Про это я не подумал.
← →
Romkin © (2006-08-01 16:30) [18]Вообще говоря, в SQL сравнить можно две таблицы на схожесть строк, но никак не полей, поля должны быть :)
Вообще говоря, запрос для EXCEPT прост:select distinct col1 from TableA
where not exists (select * from TableB
where TableA.col1 = TableB.col1)
Но вот насчет подзапроса в MySQL сомнения тревожат :)
А view есть?
← →
Romkin © (2006-08-01 16:36) [19]А если просто на совпадение, то вполне пойдет
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), иначе фокус не получится. :)
← →
Danilka © (2006-08-02 09:00) [20][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)
← →
Danilka © (2006-08-02 09:00) [21]опс, точнее так:
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)
:)
← →
VictorT © (2006-08-04 11:02) [22]
> судя по [10] запрос из запроса есть,
есть, но только именно в такой форме, как в [10], с альясом, когда результат запроса обзывают таблицей.
← →
SergP. (2006-08-07 12:04) [23]> [2] Сергей М. © (01.08.06 11:50)
> Сохрани оба НД в стрим (каждый в свой) и сравни размер и
> бинарное содержимое стримов на совпадение.
Ну это прокатит если значение этих полей item_id, store_id вместе будут уникальные....
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.109 c