Query semplice ma complessa :(
kurtis86 non è online. Ultima attività: 11/07/2008 10.41.19kurtis86
Inserito il: 10 luglio 2008 16.14
2 messaggi dal 10 lug 2008 Istalla Microsoft Silverlight!
Ciao ragazzi, so bene che quello che sto per chiedervi sarà senz'altro presente altrove, ma per quanto riguarda le query è difficile trovare il post che fa a caso proprio.

Ho un database contenente le seguenti tabelle:

le chiavi primarie sono precedute da "_"

prenotazione(_IDprenotazione), Data, Aula, Insegnamento, Note, Ora)
aula(_IDaula, NomeAula)
ora(_ora)
insegnamento(_IDinsegnamento, NomeInsegnamento, Docente)
docente(_IDdocente, _Username, Password, Nome, Cognome)



chiavi esterne

prenotazione.'Aula' -> aula.'IDaula'
prenotazione.'Insegnamento' -> insegnamento.'IDinsegnamento'
prenotazione.'Ora' -> ora.'ora'
insegnamento.'Docente' -> docente.'IDdocente'


Dopo questa panoramica delle tabelle vi spiego cosa vorrei ottenere.

Sapendo che nel campo ora.'ora' vi sono dei valori interi che vanno da 8 a 10 e che nella tabella aula vi sono solo tre aule di nome "A", "B" e "C", in base ai parametri presenti o meno nel resto delle tabelle vorrei ottenere questo:

+-----+----------+--------------+-------------+----------------+------+
|_Ora_|_NomeAula_|_Insegnamento_|_NomeDocente_|_CognomeDocente_|_Note_|
+-----+----------+--------------+-------------+----------------+------+
|__8__|____A_____|___Italiano___|___Enrica____|______Rossi_____|_null_|
|__8__|____B_____|__Matematica__|___Umberto___|_____Bianchi____|_ABC__|
|__8__|____C_____|_____null_____|____null_____|______null______|_null_|
|__9__|____A_____|_____null_____|____null_____|______null______|_null_|
|__9__|____B_____|____Fisica____|___Giacomo___|______Roma______|_DEF__|
|__9__|____C_____|_Dis._Tecnico_|____Marco____|_____Milani_____|_null_|
|_10__|____A_____|_____null_____|____null_____|______null______|_null_|
|_10__|____B_____|_____null_____|____null_____|______null______|_null_|
|_10__|____C_____|_____null_____|____null_____|______null______|_null_|
+-----+----------+--------------+-------------+----------------+------+


il tutto, aggiungendo un'ulteriore vincolo... la data

se può facilitarvi la sudata, vi posto la query da me creata... che funziona fin quando non applico il vincolo della data.

SELECT

ora.`ora` AS `q_Ora`,
NomeAula AS `q_Aula`,
NomeInsegnamento AS `q_Insegnamento`,
Nome AS `q_NomeDocente`,
Cognome AS `q_CognomeDocente`,
Note AS `q_Note` FROM

((ora JOIN aula LEFT OUTER JOIN prenotazione
ON ora.`ora` = prenotazione.`ora` AND aula.`IDaula` = prenotazione.`Aula`)
LEFT OUTER JOIN insegnamento
ON prenotazione.`Insegnamento` = insegnamento.`IDinsegnamento` )
LEFT OUTER JOIN docente ON insegnamento.`Docente` = docente.`IDdocente`

WHERE prenotazione.`data` = '2008-06-30' /* esempio */

ORDER BY `q_Ora`


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.

Vi ringrazio per il tempo speso a leggere
se ne spenderete anche a rispondere vi sarò grato
Microsoft Most Valuable Professional
Re: Query semplice ma complessa :(
Andrea Montanari non è online. Ultima attività: 30/08/2008 12.40.09Andrea Montanari
Inserito il: 11 luglio 2008 00.01
contributi / Top Poster / Community manager / www.asql.biz / 922 messaggi dal 27 lug 2005 Istalla Microsoft Silverlight!
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

Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz - http://italy.mvps.org
Re: Query semplice ma complessa :(
kurtis86 non è online. Ultima attività: 11/07/2008 10.41.19kurtis86
Inserito il: 11 luglio 2008 10.39
2 messaggi dal 10 lug 2008 Istalla Microsoft Silverlight!
Grazie!

Vai a:
Torna al forum |   Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.


fabrica - 1782 pt
vladimiro - 1741 pt
PeppeDotNet - 731 pt

Ultimi vincitori: PeppeDotNet, fabrica, vladimiro

Iscriviti anche tu e raccogli punti. Questo mese in palio VS 2008 + Windows Server 2008, ReShaper e 1 ebook!



COMMUNITY
ULTIMI MESSAGGI


IN EVIDENZA
MISC
Powered by .db Forums