Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2

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.
Разумеется, при условии что оба НД не слишком велики по объему данных.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо