Buongiorno, devo provare a creare una sorta di magazzino fatto a caselle, le quali hanno ognuna 3 coordinate che le fanno diventare uniche.

Ogni casella di questo "magazzino" avr� le coordinata X, Y e Z.

X va da 1 a 5
Y va da 1 a 5
Z va da 1 a 2

Ho previsto oltre a questi 3 campi, un campo ID per evitare di dover leggere tutte e 3 le coordinate ed un campo Occupata, cos� da sapere se pu� essere utilizzata o no la casella.

Mi sto scervellando per trovare un metodo per poter trovare velocemente il numero di caselle che mi servono.

Praticamente queste caselle vengono occupate e io devo decidere quali.

Se un articolo come dimensione occupa una sola casella, quando dovr� inserirlo, mi baster� cercare la prima casella libera.

Ogni articolo per� pu� occupare pi� caselle in X o in Z o in X e Z, mai in Y.
La cosa importante � che se l'articolo occupa pi� caselle, queste devono essere consecutive.

Quindi per fare capire, la tabella pu� essere rappresentata cos�:

codice:
ID - X - Y - Z - Occupato

1     1   1   1         1
2     1   1   2         0
3     2   1   1         0
4     2   1   2         0
5     3   1   1         0
6     3   1   2         0 
7     4   1   1         0
8     4   1   2         0
9     5   1   1         0
10   5   1   2         0
11   1   2   1         0
12   1   2   2         0
Per fare un esempio, se occupa 1 casella in X ed entrambe (dato che al massimo possono essere 2) in Z, dovr� cercare la prima coppia di caselle tenendo conto solo di X-Y che hanno Occupato = NULL, quindi usando la tabella, dovr� selezionare la coppia X = 2, Y = 1.

Per farlo, ho utilizzato questo codice:

codice:
  SELECT DISTINCT X, Y  FROM Caselle c1
  WHERE NOT EXISTS (SELECT X, Y
                    FROM Caselle c2
                    WHERE Occupato IS NOT NULL AND c1.X = c2.X AND c1.Y = c2.Y)
In questo modo, prima cerco le caselle occupate (dato che in questo caso non potr� pi� utilizzare l'altra Z anche se fosse libera) e vado ad escluderle dalla selezione totale.

Ora per� dovrei fare pi� o meno la stessa cosa, ma per la X e X-Z.

Quindi, ipotizzando che l'articolo occupi 3 caselle in X e 1 in Z, dovr� trovare, per esempio, le caselle con ID = 2, 4, 6 oppure ID = 3, 5, 7.

La stessa cosa dovrei poterla fare nel caso in cui l'articolo occupi 3 caselle in X e 2 in Z, quindi dovrei integrare i due metodi ed avere come risultato le caselle con ID = 3, 4, 5, 6, 7, 8.

Spero di essere stato chiaro!
Se qualcuno sapesse aiutarmi, sarebbe molto apprezzato