Dr. Baranyai László

 

Hiányzó adatok SQL adatbázisban

júl 9, 21:08, |

 

Adatbázisokkal dolgozó alkalmazásokban szükség lehet az adatok ellenőrzésére, például hiányzó sorok detektálására. A feladat első közelítésben abszurdnak tűnik, hiszen ha nem létezik, hogyan is lehetne megtalálni? Aki tudja a megoldást, annak már könnyű. A többiek kutathatnak az interneten.

Minta adatok

A probléma bemutatásához készítsük el pl. alapanyagok (product) és azok rendelt mennyisége (orders) tábláit. A bemutatott kódok kipróbáltan működtek SQLite 3.6.16 adatbázis kezelővel. Íme a teszt adatok feltöltése az alapanyagokhoz:

BEGIN TRANSACTION;
CREATE TABLE product (pid INT, name TEXT);
INSERT INTO product VALUES(1,'Liszt');
INSERT INTO product VALUES(2,'Tojas');
INSERT INTO product VALUES(3,'Eleszto');
INSERT INTO product VALUES(5,'Olaj');
INSERT INTO product VALUES(6,'So');
COMMIT;

valamint a rendelésekhez:

BEGIN TRANSACTION;
CREATE TABLE orders (pcode INT, quantity REAL);
INSERT INTO orders VALUES(1,3.5);
INSERT INTO orders VALUES(1,0.5);
INSERT INTO orders VALUES(2,15.0);
INSERT INTO orders VALUES(4,2.0);
INSERT INTO orders VALUES(4,5.1);
INSERT INTO orders VALUES(6,1.2);
INSERT INTO orders VALUES(7,3.0);
COMMIT;

Természetesen egy üzleti alkalmazás ennél sokkal bonyolultabb, további oszlopokkal és indexekkel. Ezt mindenki saját fantáziájára bízom, itt csak a lényeget szeretném bemutatni.

SQL lekérdezések

Egy tipikus rendelési napló a következő módon hozható létre:

SELECT product.*,SUM(orders.quantity) FROM product,orders
 WHERE product.pid=orders.pcode
 GROUP BY product.pid
 ORDER BY product.name;

Aminek az eredménye:

1           Liszt       4.0
6           So          1.2
2           Tojas       15.0

Ez eddig rendben is lenne, de van-e esetleg olyan rendelt alapanyag, amelynek nincs párja a törzsadatok között?

SELECT DISTINCT orders.pcode FROM orders
 LEFT JOIN product ON orders.pcode=product.pid
 WHERE product.pid IS NULL;

Valóban, a fenti adatok alapján kiderül, hogy a 4 és 7 kódokhoz nem rendeltünk nevet, így a rendelési listában sem jelentek meg. Ez az ellenőrzés azért fontos, mert inkonzisztens adatokra hívja fel a figyelmet.

Fordított irányban is érdekes lehet a kérdés: van-e olyan alapanyag, amelyből nem rendeltünk?

SELECT DISTINCT product.name FROM product
 LEFT JOIN orders ON product.pid=orders.pcode
 WHERE orders.pcode IS NULL;

Aminek az eredménye a fenti adatokra:

Eleszto
Olaj

A DISTINCT kulcsszó azért szükséges, hogy csupán egyetlen példányban listázzuk ki a neveket, ne pedig az összes előfordulásukat.

Habár ez a trükk sok helyen fellelhető az interneten, gondoltam én is megosztom egy kisebb példával együtt.

 

Megjegyzés

Ehhez a cikkhez nem fűzhető megjegyzés!

Hazai időjárás

Magyarország domborzati hőtérképe Felhőkép

 

Hirdetések

Linux for open minds.

 

Aktuális írások

Legfrissebb cikkek

 

Hozzászólások

 

RSS feed   Atom feed

 

ScienceDaily Newsfeed

ScienceDaily.com