Порівняння результатів двох запитів

Порівняння результатів двох запитів

Як еффективно перевірити, що 2 запити повертають однаковий набір даних (один і той же кількість рядків, одні і ті ж значення полів, в загальному, все одне і те ж).

Запити типу таких:

select # XA0; item_id, store_id, quantity from tbl_invoice_reserv where invoice_id = 1154346284 order by item_id, store_id

select # XA0; item_id, store_id, item_quantity as quantity from tbl_sales_items_details where invoice_id = 1154346284 order by item_id, store_id

У мене є кілька варіантів, але хотілося б почути, що запропонуєте ви, тому що мої мені не дуже подобаються (за винятком одного).

MINUS в м'яз не прокатує? Якщо немає, то можна спробувати порівняти кількість записів в окремому запиті і в сумарному (через UNION без ALL). Якщо НД однаковий, то кількість записів має збігатися.

Збережи обидва НД в стрім (кожен в свій) і порівняй розмір і бінарне вміст стрімів на збіг.


> MINUS в м'яз не прокатує?

Ні-і, якщо я правильно зрозумів, планується в наступних версіях.

> Якщо немає, то можна спробувати порівняти кількість
> Записів в окремому запиті і в сумарному (через UNION
> Без ALL). Якщо НД однаковий, то кількість записів
> Має збігатися.
щось на зразок цього у мене як раз і крутилося в голові.

> Збережи обидва НД в стрім
А що таке стрім?

Потік даних.
У твоєму випадку нехай це буде станд.класс TMemoryStream.
Зрозуміло, за умови що обидва НД не надто великі за обсягом даних.

А що, PHP хіба не дозволяє підключати і використовувати зовнішні бібл.модулі (в т.ч. і розроблені в Делфі) для обробки деяких даних. Я просто не в курсі.

Поки зупиняюся на такому варіанті - виконуємо два запити і порівнюємо результати:

select # XA0; count (*) from tbl_invoice_reserv where invoice_id = 1154346284

select count (*) from
(
select # XA0; item_id, store_id, quantity from tbl_invoice_reserv where invoice_id = 1154346284
union
select # XA0; item_id, store_id, item_quantity as quantity from tbl_sales_items_details where invoice_id = 1154346284
)
as union_table

Може хто ще щось запропонує?

* На item_id заміни. Я не юзал м'язів, але гірше точно не буде.

На distinct зверни увагу.

Число записів в будь-якому з вихідних НД і число записів в

select distinct * from (union-запит)

має збігатися, якщо НД ідентичні


> * На item_id заміни. Я не юзал м'язів, але гірше точно
> Не буде.

ок.

> На distinct зверни увагу.
distinct для union по дефолту, якщо не помиляюся.
З.И. А я забув ще про третій запит:
select # XA0; count (*) from tbl_sales_items_details where invoice_id = 1154346284

Якщо так, то тим більше.

Для очищення совісті можна і його, але за великим рахунком він зайвий. Раз не додав записів в суумірующій, то він дорівнює першому.


> За великим рахунком
> Він зайвий.

Я теж спочатку подумав.

> Раз не додав записів в суумірующій, то він дорівнює
> Першому.
Або в ньому менше записів, але ті, що є, збігаються з першим.

> Або в ньому менше записів, але ті, що є, збігаються з
> Першим.

Логічно. Про це я не подумав.

Взагалі кажучи, в SQL порівняти можна дві таблиці на схожість рядків, але ніяк не полів, поля повинні бути :)
Взагалі кажучи, запит для EXCEPT простий:
select distinct col1 from TableA
where not exists (select * from TableB
# XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; # XA0; where TableA.col1 = TableB.col1)
Але от щодо підзапиту в MySQL сумніви тривожать :)
А view є?

А якщо просто на збіг, то цілком піде
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), інакше фокус не вийде. )

select # XA0; 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)

опс, точніше так:
select # XA0; 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)


> Судячи з [10] запит із запиту є,

є, але тільки саме в такій формі, як в [10], з Альяс, коли результат запиту обзивають таблицею.

Ну це прокотить якщо значення цих полів item_id, store_id разом будуть унікальні.

Схожі статті