|
Supponiamo di avere una tabella che presenti, tra i suoi attributi, uno di tipo numerico intero. Se avessimo la necessità di presentare ogni riga della tabella ripetuta n volte (dove n è il valore di tale attributo), potremmo farlo con il solo ausilio del linguaggio SQL? Un tipico esempio in cui sorge tale necessità è la stampa di etichette di codici a barre: "dato un ordine cliente, viene chiesto di stampare il codice a barre degli articoli presenti nell'ordine. Dal momento che ogni pezzo deve essere imballato in un cartone separato, per ogni articolo si ha bisogno di tante etichette quante sono le quantità ordinate". Di seguito una soluzione a questo tipo di problema. Si tenga conto che tale soluzione presenta una limitazione rappresentata dal dominio dell'attributo che esprime il numero di ripetizioni: olte a trattarsi di un numero naturale, ovvero un intero positivo - ma questo è banale -, deve essere finito, poichè si presuppone l'esistenza di una tabella popolata a priori con un certo numero di interi positivi. Così, per esempio, se decidiamo di avvalerci dei numeri da 1 a 100, la soluzione proposta non sarà in grado di presentare più di 100 volte una riga, limitandosi a presentarne al massimo 100. Perciò, sarà necessario "dimensionare" adeguatamente la nostra tabella a seconda degli usi a cui sarà destinata. Avvalendoci del database di esempio Northwind di MS-SQL Server, creiamo la tabella [Set Of Numbers] e la popoliamo con l'insieme continuo di numeri interi positivi fino a 100, e scriviamo una query che ci consente di ottenere tante riqhe di [Order Details] quante sono le quantità ordinate in uno specifico ordine ([Order Details].OrderID = 11077). USE Northwind GO CREATE TABLE [Set Of Numbers] ( Number INT PRIMARY KEY ) GO DECLARE @i INTEGER SET @i = 0 WHILE @i <= 100 BEGIN INSERT INTO [Set Of Numbers] (Number) VALUES (@i) SET @i = @i + 1 END GO La query opera una INNER JOIN tra la tabella [Order Details] e la [Set Of Numbers] con una condizione di JOIN che presenta l'operatore di confronto ">" (maggiore) ([Order Details].Quantity > [Set Of Numbers].Number) al posto di "=" (uguale), che siamo più soliti usare. SELECT ProductID, Quantity, UnitPrice, Discount FROM [Order Details] INNER JOIN [Set Of Numbers] ON [Order Details].Quantity > [Set Of Numbers].Number WHERE OrderID = 11077 ORDER BY ProductID Una versione alternativa della query di cui sopra presenta un prodotto cartesiano tra le due tabelle [Order Details] e [Set Of Numbers] con la condizione JOIN di prima spostata in quella di selezione. SELECT ProductID, Quantity, UnitPrice, Discount FROM [Order Details], [Set Of Numbers] WHERE ([Order Details].Quantity > [Set Of Numbers].Number) AND OrderID = 11077 ORDER BY ProductID P.S.: grazie a Giuseppe "Nexus2" Lischi e Pasquale Ceglie, i quali mi hanno suggerito questa soluzione.
|