Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.059 c
3-1154528943
VadimSpb
2006-08-02 18:29
2006.10.08
Число параметров


3-1155213781
Ega23
2006-08-10 16:43
2006.10.08
конструкция Update ... Set ID=(Select)


6-1147857716
alb67
2006-05-17 13:21
2006.10.08
Ошибка при пинге


2-1158829400
fifi01
2006-09-21 13:03
2006.10.08
TStringList


2-1158643331
Mishenka
2006-09-19 09:22
2006.10.08
Как работать с Gif в GraphicEx?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский