Ca interogare SQL, extrageți informații din baza de date care nu există

Ca interogare sql, extrageți informații din baza de date care nu există acolo +11

  • 15.06.16 01:25 •
  • avshukan •
  • # 303364
  • Habrahabr •
  • 34 •
  • 9300

- la fel ca Forbes, doar mai bine.







Sub o astfel de poziție vicleană, se ascunde o sarcină destul de simplă, dar mai întâi o mică introducere:

Utilizatorii vin și întreabă: "Aici am introdus datele în baza de date și ne spun ce lipsește? Ce date nu am introdus încă în baza de date și nu sunt suficiente pentru fericirea completă? "
Prima reacție (și sincer, foarte proastă): "Cum vă pot găsi ce nu este în baza de date?".

Dar respingem emoțiile și aplicăm logica. La urma urmei, de regulă, datele solicitate, formarea care face obiectul unor norme - numărul cecului, referințe și așa mai departe ... Și presupun că toate aceste numere și identificatori pot fi convertite într-o secvență naturală.
Adică, sarcina va fi formulată după cum urmează: baza de date stochează o secvență de numere naturale, în care există lacune, și este necesar să se afișeze numerele lipsă pentru utilizator.
În această formulare, problema pare deja destul de simplă. Mai mult decât atât - există o dorință de a implementa această sarcină cu o singură interogare sql.

Să creăm un tabel și să îl umplem cu unele date.

Ideea de bază este după cum urmează: compară tabelul de la sine și, de asemenea, pentru fiecare valoare de X pentru a găsi minim y (care este încă mai mult decât Ix), în cazul în care (X + 1) și (y - 1) vor fi granițele noastre ratat numere intervale. Adăugând condiția logică pe care (X + 1) trebuie să fie de cel puțin (y - 1) obținem următoarele intervale: 4 la 4, 6-6, 10 la 10 și 13 la 15.
Care sunt nuanțele:
1) Primul element al secvenței (în cazul nostru este 1) poate fi omis.
2) Ultimul element al secvenței nu este cunoscut (și dintr-o dată este 22). Puteți, desigur, să solicitați aceste informații de la utilizator, însă experiența sugerează că este mai bine să evitați acest lucru.






3) Domeniul "de la 4 la 4" arată buggy, este necesar să se înlocuiască pur și simplu cu un singur număr
4) Rezultatul este încă de dorit pentru a obține valoarea unei linii, mai degrabă decât a unui set de linii

Luăm în considerare comentariile și obțineți un script pentru MySQL:

și versiunea sub Oracle:

Rezultatul execuției lor este linia "1-2, 4, 6, 10, 13-15, 18."
În primul rând, această linie conține ceea ce au dorit utilizatorii.
În al doilea rând, rezultatul este clar pentru orice utilizator.
Și în principiu, interogarea afișează date care nu sunt într-adevăr stocate în baza de date!

Opțiune pentru MySQL din asmm

Opțiunea pentru Oracle de la xtender

Opțiunea pentru MSSQL de la yizraor

Ei bine, acesta este un caz general, nu un sql ... Cel mai simplu lucru este să găsiți un bilet (pentru un tren) dacă nu există bilete. Cai ferate caracteristică și sisteme similare - a avut loc lung cu rezerve primul mare oraș mic stație, de exemplu, pentru Kiev, aceasta ar putea fi Darnitsa, Brovary, Bakhmach, Konotop - și dacă din biletele Kiev Moscova nu este bine - că din aceste puncte pot fi, și, cel mai surprinzător, va fi în sistem și bilete la ele - și ar putea fi în același birou pentru a cumpăra pe același tren-scaun de mașină - un lanț de la Kiev + Bakhmach Bakhmach Moscova. (și dacă defalcarea se face din nou în Belgorod - va fi și mai ieftină).
Principalul lucru în capul meu o crestătură că „în cazul în care (a) sistemul ceva nu este - aceasta nu înseamnă că acest lucru nu este deloc“ ca „în fiecare pustnyne există o oază de ... Dar nu orice cămilă poate găsi“
Și la fel ca într-o rafinărie de petrol, mai multe fântâni din sistem s-au pierdut ... (care de mult timp și nu au ghicit) ...
Totuși, oamenii pierd în mod regulat camerele de supraveghere - și, de asemenea, din ambele capete, căutarea este amuzantă - acele persoane care au mai puține camere live. ce fel instalat nu doar amintesc brusc că dimpotrivă, pe teren - agățat în camera de la mansardă, aproape alimentat de lumină, fluxul de conducere pe Wi-Faya, a cărui, atunci când, de către cine livrate - este necunoscut, locatarii încearcă să se distanțeze - nu spun noastre ...

La un loc de muncă anterior (muzeu), de multe ori a devenit necesar pentru a afla ce lipsesc numerele de inventar (pe care sa bazat toată logica). Decizia a fost în mod substanțial la fel ca și ați prezentat (singura diferență este că numărul ar putea fi sub formă [some_letters] 12345 [[START_NUMBER] [scrisoarea]] [-] [[END_NUMBER] [scrisoarea]], între paranteze pătrate - opțional blocuri).
Din fericire, a existat o bază de date în care au fost enumerate decalajele acestor numere (în formularul [some_letters] 12345 [start-end]).
Cerere, cu toate acestea, rezultatul a fost dificil, deoarece a existat încă o mulțime de cazuri, care urmează să fie verificate (utilizatorii introduc o conexiune de date extrem de diferite, și, în cele din urmă, sa dovedit că relevanța căutare nu a ratat numere și numere pentru care a făcut mai multe înregistrări) .

Da, am considerat cel mai simplu caz (-:

Utilizarea variabilelor poate fi mai simplă. În principiu, se poate face fără cuib de nivel 3, dar pare mai clar.







Articole similare

Trimiteți-le prietenilor: