salve,
kurtis86 wrote:
...
Dopo aver applicato il vincolo WHERE, infatti, mi vengono soppresse le righe che non riferiscono alla data indicata, ma è assolutamente vitale che vengano elencate TUTTE le ore della fascia oraria e TUTTE le aule.
hai provato a spostare il filtro sulla data nella definizione della join, in modo che non vengano soppresse le righe nullate?
in SQL Server, ad esempio, potresti forse scrivere qualche cosa simile a SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE prenotazione (
IDprenotazione int,
Data datetime,
Aula int,
Insegnamento int,
Note varchar(5),
Ora int
);
CREATE TABLE aula(
IDaula int,
NomeAula varchar(5)
);
CREATE TABLE ora(
ora int
);
CREATE TABLE insegnamento (
IDinsegnamento int,
NomeInsegnamento varchar(10),
Docente int
);
CREATE TABLE docente (
IDdocente int,
Username varchar(10),
[Password] varchar(10),
Nome varchar(10),
Cognome varchar(10)
);
GO
INSERT INTO insegnamento VALUES ( 1, 'Italiano', 1 );
INSERT INTO insegnamento VALUES ( 2, 'Fisica', 2 );
INSERT INTO insegnamento VALUES ( 3, 'Chimica', 3 );
INSERT INTO insegnamento VALUES ( 4, 'Storia', 1 );
INSERT INTO insegnamento VALUES ( 5, 'Geografia', 4 );
INSERT INTO insegnamento VALUES ( 6, 'Ed.Fisica', 5 );
INSERT INTO docente VALUES ( 1, 'A', 'p', 'nome1', 'cognome1' ); INSERT INTO docente VALUES ( 2, 'A', 'p', 'nome2', 'cognome2' ); INSERT INTO docente VALUES ( 3, 'A', 'p', 'nome3', 'cognome3' ); INSERT INTO docente VALUES ( 4, 'A', 'p', 'nome4', 'cognome4' ); INSERT INTO docente VALUES ( 5, 'A', 'p', 'nome5', 'cognome5' );
INSERT INTO ora VALUES ( 8 );
INSERT INTO ora VALUES ( 9 );
INSERT INTO ora VALUES ( 10 );
INSERT INTO aula VALUES ( 1, 'A' );
INSERT INTO aula VALUES ( 2, 'B' );
INSERT INTO aula VALUES ( 3, 'C' );
INSERT INTO prenotazione VALUES ( 1, '20080701', 1, 1, 'note', 8 ); INSERT INTO prenotazione VALUES ( 2, '20080701', 2, 4, 'note', 9 ); INSERT INTO prenotazione VALUES ( 3, '20080701', 3, 2, 'note', 10 ); INSERT INTO prenotazione VALUES ( 4, '20080701', 1, 4, 'note', 10 ); INSERT INTO prenotazione VALUES ( 5, '20080701', 2, 2, 'note', 8 ); INSERT INTO prenotazione VALUES ( 6, '20080701', 3, 1, 'note', 9 );
INSERT INTO prenotazione VALUES ( 7, '20080702', 2, 1, 'note', 8 ); INSERT INTO prenotazione VALUES ( 8, '20080702', 3, 4, 'note', 9 ); INSERT INTO prenotazione VALUES ( 9, '20080702', 1, 2, 'note', 10 ); INSERT INTO prenotazione VALUES ( 10, '20080702', 2, 4, 'note', 10 ); INSERT INTO prenotazione VALUES ( 11, '20080702', 3, 2, 'note', 8 ); INSERT INTO prenotazione VALUES ( 12, '20080702', 1, 1, 'note', 9 );
GO
DECLARE @d datetime;
SET @d = '20080701';
SELECT q.ora, q.NomeAula, i.NomeInsegnamento , d.Nome, d.Cognome FROM prenotazione p
RIGHT JOIN (SELECT o.ora, a.idaula, a.NomeAula FROM ora o CROSS JOIN aula a) q
ON q.ora = p.ora AND p.aula = q.idaula AND p.data = @d
LEFT JOIN insegnamento i ON i.idInsegnamento = p.Insegnamento LEFT JOIN docente d ON d.idDocente = i.docente
ORDER BY q.ora, q.idaula
GO
DROP TABLE docente, insegnamento, ora, aula, prenotazione;
--<----------
ora NomeAula NomeInsegnamento Nome Cognome
---------
------
--------------
--------
----------
8 A NULL NULL NULL
8 B Italiano nome1 cognome1
8 C Fisica nome2 cognome2
9 A Italiano nome1 cognome1
9 B NULL NULL NULL
9 C Storia nome1 cognome1
10 A Fisica nome2 cognome2
10 B Storia nome1 cognome1
10 C NULL NULL NULL
la cross join tra ore e aule comunque proietta le "9" righe e la successiva RIGHT JOIN con le prenotazioni ovviamente non ne filtra via alcuna, sempre che successivamente non venga impostato il filtro di WHERE data = @d.. saluti