Comparați rezultatele a două interogări
Cum pot verifica în mod eficient faptul că 2 cereri returnează același set de date (același număr de rânduri, aceleași valori de câmp, în general, toate aceleași).
Anchete cum ar fi:
selecta # XA0; ITEM_ID, store_id, cantitatea din tbl_invoice_reserv unde invoice_id = 1154346284 comanda prin ITEM_ID, store_id
selecta # XA0; ITEM_ID, store_id, item_quantity ca cantitate din tbl_sales_items_details unde invoice_id = 1154346284 comanda prin ITEM_ID, store_id
Am mai multe opțiuni, dar aș vrea să aud ceea ce oferiți, tk. Nu-mi plac a mea (cu excepția unui singur).
MINUS în muschi nu se rostogolește? Dacă nu, puteți încerca să comparați numărul de înregistrări într-o interogare separată și în rezumat (prin UNION fără ALL). Dacă ND este aceeași, atunci numărul de intrări trebuie să fie același.
Păstrați ambele ND în flux (fiecare în propriul lor) și comparați mărimea și conținutul binar al fluxurilor pentru a coincide.
> MINUS în muschi nu se rostogolește?
Nu, dacă înțeleg corect, este planificată în versiunile următoare.
> Dacă nu, atunci puteți încerca să comparați suma
> înregistrează într-o interogare separată și într-un rezumat (prin intermediul UNION
> fără ALL). Dacă ND este aceeași, numărul de înregistrări
> trebuie să se potrivească.
ceva de genul ăsta, tocmai mi-am răsuci în cap.
> Păstrați ambele ND-uri în flux
Și ce este fluxul?
Flux de date.
În cazul tău, lăsați-l să fie clasa standard a TMemoryStream.
Desigur, cu condiția ca ambele ND-uri să nu fie prea mari în ceea ce privește volumul de date.
Și ce, PHP nu vă permite să conectați și să utilizați bibl.moduli externi (inclusiv și dezvoltați în Delphi) pentru a gestiona anumite date. Nu știu.
În timp ce opresc această opțiune, efectuăm două interogări și comparăm rezultatele:
selecta # xA0; count (*) din tbl_invoice_reserv unde invoice_id = 1154346284
selectați numărul (*) de la
(
selecta # xA0; item_id, store_id, cantitatea din tbl_invoice_reserv unde invoice_id = 1154346284
uniune
selecta # XA0; ITEM_ID, store_id, item_quantity ca cantitate din tbl_sales_items_details unde invoice_id = 1154346284
)
ca union_table
Poate altcineva va oferi ceva?
* pe item_id înlocuiți. Nu am folosit mușchi, dar nu va fi mai rău.
Priviti atentia distincta.
Numărul de înregistrări în oricare dintre ND-urile originale și numărul de intrări în
selectați distinct * de la (union-request)
trebuie să coincidă dacă ND sunt identice
> * pe item_id înlocuiți. Nu am folosit muschi, dar e mai rău
> nu va.
aproximativ
> Privind atenție distinctă.
distinct pentru uniune în mod implicit, dacă nu mă înșel.
ZY Și am uitat de a treia cerere:
selecta # xA0; număr (*) din tbl_sales_items_details unde invoice_id = 1154346284
Dacă este așa, atunci chiar mai mult.
Pentru a șterge conștiința, poți și tu, dar în mare este superfluu. Dacă nu adăugați înregistrări la utilizator, atunci acesta este egal cu primul.
> în ansamblu
> El este de prisos.
De asemenea, am crezut la început.
> Odată ce nu a adăugat intrări la utilizator, atunci este egal cu
> primul.
Sau există mai puține înregistrări, dar cele care sunt, coincid cu prima.
> Fie că există mai puține intrări în el, dar cele care sunt, coincid cu
> primul.
Este logic. Despre asta nu m-am gândit.
În general, în SQL puteți compara două tabele pentru similitudinea liniilor, dar nu există câmpuri, câmpurile ar trebui să fie :)
În general, interogarea pentru EXCEPT este simplă:
selectați col1 distinct de la TableA
unde nu există (selectați * din TableB
# xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; # xA0; unde TableA.col1 = TableB.col1)
Dar aici despre subiectiile din MySQL, indoielile sunt ingrijoratoare :)
Există o vedere?
Și dacă este doar o coincidență, atunci va merge destul de bine.
selectați TableA. *
din tabelul A, legătura exterioară stângă TableB pe (TableA.col1 = TableB.col1)
unde TableB.col1 este NULL
UNION
selectați TableB. *
din tabelul B legătura exterioară stângă TableA pe (TableB.col1 = TableA.col1)
unde TableA.col1 este NULL
Aici, bineînțeles, avem în vedere aceleași câmpuri în ambele mese. Dacă coincid, rezultatul este gol. De fapt, prima interogare ia toate valorile care nu sunt în al doilea tabel, în al doilea - invers.
O altă condiție - col1 în ambele tabele nu ar trebui să ia valori goale (să fie declarate ca col1 nu NULL), în caz contrar focalizarea nu va funcționa. )
selecta # xA0; item_id, store_id, cantitatea din tbl_invoice_reserv t1 unde invoice_id = 1154346284
în cazul în care nu există (selectați 1 din tbl_sales_items_details t2 unde t2.invoice_id = 1154346284 și t2.item_id = t1.item_id și t2.store_id = t1.store_id și t1.quantity = t2.item_quantity)
ops, mai precis:
selecta # xA0; item_id, store_id, cantitatea din tbl_invoice_reserv t1 unde invoice_id = 1154346284
și nu există (selectați 1 din tbl_sales_items_details t2 unde t2.invoice_id = 1154346284 și t2.item_id = t1.item_id și t2.store_id = t1.store_id și t1.quantity = t2.item_quantity)
> Judecând după [10] cererea din interogare este,
există, dar numai în exact aceeași formă ca și în [10], cu aliasul, atunci când rezultatul interogării este numit tabel.
Ei bine, se va derula dacă valoarea acestor câmpuri item_id, store_id împreună va fi unică.