Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.08;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.048 c
1-1156495349
DelphiLexx
2006-08-25 12:42
2006.10.08
CopyRect не работает для TMetaFileCanvas


3-1154418338
VictorT
2006-08-01 11:45
2006.10.08
Сравнение результатов двух запросов


6-1147542695
RUNaum
2006-05-13 21:51
2006.10.08
Распаковать gzip-архив


1-1156592778
SergV
2006-08-26 15:46
2006.10.08
OleContainer + любой браузер


15-1158514450
ArtemESC
2006-09-17 21:34
2006.10.08
Запутался с дискетами...