si desidera eseguire la divisione relazionale, un'operazione che non è implementata in SQL. Ecco un esempio in cui abbiamo un prodotto-fornitore tavolo e un -prodotti richiesti tavolo:
CREATE TABLE product_supplier (
product_id int NOT NULL,
supplier_id int NOT NULL,
UNIQUE (product_id, supplier_id)
);
INSERT INTO product_supplier (product_id, supplier_id) VALUES
(1, 1),
(2, 1),
(3, 1),
(1, 2),
(2, 2),
(3, 2),
(4, 2),
(2, 3),
(3, 3),
(4, 3);
CREATE TABLE reqd (
product_id int NOT NULL,
UNIQUE (product_id)
);
INSERT INTO reqd (product_id) VALUES
(1),
(2),
(3);
... e vogliamo trovare tutti i fornitori che forniscono tutti i prodotti necessari e forse altri. Il risultato nell'esempio sopra sarebbe il fornitore 1 e 2.
La soluzione in avanti più retta è questo:
SELECT product_supplier.supplier_id
FROM product_supplier
LEFT JOIN reqd ON product_supplier.product_id = reqd.product_id
GROUP BY product_supplier.supplier_id
HAVING COUNT(reqd.product_id) = (SELECT COUNT(*) FROM reqd);
+-------------+
| supplier_id |
+-------------+
| 1 |
| 2 |
+-------------+
E se vogliamo trovare tutti i fornitori che forniscono tutti i prodotti necessari e non altre (divisione esatto/senza resto) quindi aggiungere una condizione più a quanto sopra:
SELECT product_supplier.supplier_id
FROM product_supplier
LEFT JOIN reqd ON product_supplier.product_id = reqd.product_id
GROUP BY product_supplier.supplier_id
HAVING COUNT(reqd.product_id) = (SELECT COUNT(*) FROM reqd)
AND COUNT(product_supplier.product_id) = (SELECT COUNT(*) FROM reqd);
+-------------+
| supplier_id |
+-------------+
| 1 |
+-------------+
Una soluzione alternativa consiste nel riformulare il problema: selezionare s uppliers dove non esiste un prodotto richiesto che non esiste nei prodotti forniti dal fornitore. Hmmm:
SELECT DISTINCT supplier_id
FROM product_supplier AS ps1
WHERE NOT EXISTS (
SELECT *
FROM reqd
WHERE NOT EXISTS (
SELECT *
FROM product_supplier AS ps2
WHERE ps1.supplier_id = ps2.supplier_id AND ps2.product_id = reqd.product_id
)
);
+-------------+
| supplier_id |
+-------------+
| 1 |
| 2 |
+-------------+
grazie ma l'uscita che ho è ripetuto credo perché per creare automobili tavolo ho usato INNER JOIN – user1229351
Tuttavia, questo non funziona con caratteri jolly, poiché in tal caso il conteggio esplicita non può essere stabilito –