Iner join tra due tabelle

domenica 06 gennaio 2008 - 11.41

vitempe Profilo | Newbie

ciao a tutti
sto provando mysql da una settimana ma non riesco a risolvere un problemino
ho una tabella dipendenti (matricola,anno,mese etc)
ho la tabella movimenti(matricola,anno,mese etc)
si potrebbe verificare che non vengano inseriti i movimenti di tutti i dipendenti, come faccio a farmi ritornare con una query
tutti i dipendenti mancanti dell'anno/mese in questione?
se scrivo la select in questo modo
SELECT anabud_annobud,
anabud_mese,
anabud_cartellino
FROM
anabud
INNER JOIN
cosdip
ON (anabud_annobud = cosdip_anno)
AND (anabud_mese = cosdip_mese)
AND (anabud_cartellino = cosdip_cartellino)
WHERE (anabud_annobud = '2007')
AND (anabud_mese = '12')
AND (`anabud_cartellino NOT IN .cosdip_cartellino)
mi ritorna il messaggio di errore come se NOT IN non fosse supportato
e' vero?
come posso scrivere la query per risolvere il problema?
grazie

lbenaglia Profilo | Guru

>ho una tabella dipendenti (matricola,anno,mese etc)
>ho la tabella movimenti(matricola,anno,mese etc)
>si potrebbe verificare che non vengano inseriti i movimenti di
>tutti i dipendenti, come faccio a farmi ritornare con una query
>tutti i dipendenti mancanti dell'anno/mese in questione?

Ciao Virgilio,

posta i comandi DDL delle due tabelle (CREATE TABLE), alcune righe di prova (INSERT INTO) ed il result set finale che vuoi ottenere con quei dati.

>grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

vitempe Profilo | Newbie

grazie,
ma cosa vuoi dire con posta i dati? Forse di inserire movimenti nelle due tabelle?
gia' l'ho fatto
ciao

lbenaglia Profilo | Guru

>grazie,
>ma cosa vuoi dire con posta i dati?

CREATE TABLE...
INSERT INTO....
INSERT INTO....
INSERT INTO....
INSERT INTO....
INSERT INTO....

Con questi dati vorrei ottenere il seguente risultato:

colonna_1....colonna_n ---------- ---------- ....... ....... ....... ....... ....... ....... ....... .......

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

vitempe Profilo | Newbie

si ok!!
forse non mi sono spiegato bene, ci riprovo con un esempio:
ho questa situazione:
tabella anadip tabella movimenti

matricola anno mese matricola anno mese

1 2007 12 1 2007 12
2 2007 12 3 2007 12
3 2007 12

avendo questa situazione debbo fermare subito l'elaborazione in quanto per la matricola 2 non sono stati inseriti
i movimenti , questo lo vorrei fare con una select che mi dovrebbe ritornare

matricola anno mese
2 2007 12

e questo lo volevo fare con la select iniziale, e' chiaro che lo posso fare scorrendo la tabella anadip e per ogni matricola
leggere sui movimenti se esistono o no i movimenti, ma tutto questo non mi piace perche' mi sembra di non sfruttare le potenzialita'
di sql.
ciao e cmq grazie per l'attenzione

lbenaglia Profilo | Guru

>si ok!!
>forse non mi sono spiegato bene, ci riprovo con un esempio:
>ho questa situazione:
>tabella anadip
>tabella movimenti

Perdonami, ma non stiamo parlando la stessa lingua
Se desideri agevolare la vita a chi cerca di aiutarti, dovresti scrivere i comandi DDL di CREATE TABLE delle tabelle in questione, alcune righe di esempio con i comandi DML INSERT INTO ed il risultato in forma tabellare che vuoi ottenere.

>
>matricola anno mese matricola
>anno mese
>
>1 2007 12
>1 2007 12
>2 2007 12
>3 2007 12
>3 2007 12
>
>avendo questa situazione debbo fermare subito l'elaborazione
>in quanto per la matricola 2 non sono stati inseriti
>i movimenti , questo lo vorrei fare con una select che mi dovrebbe
>ritornare
>
>matricola anno mese
>2 2007 12

A me questo esempio dice veramente poco.
Prova a fornirci i dati che ti ho chiesto e vedrai che ne verremo a capo.

>ciao e cmq grazie per l'attenzione
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

vitempe Profilo | Newbie

bene
CREATE TABLE `anabud` (
`anabud_societa` int(10) UNSIGNED NOT NULL ,
`anabud_annobud` char(4) NOT NULL,
`anabud_mese` char(2) NOT NULL,
`anabud_cartellino` char(6) NOT NULL,
`anabud_cognome` char(20) NOT NULL,
`anabud_nome` char(20) NOT NULL,
`anabud_assunzione` char(8) NOT NULL,
`anabud_dismissione` char(8) NOT NULL,
`anabud_livello` char(3) NOT NULL,
`anabud_contratto` char(1) NOT NULL,
PRIMARY KEY (`anabud_societa`,`anabud_annobud`,`anabud_mese`,`anabud_cartellino`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `cosdip` (
`cosdip_societa` int(11) NOT NULL,
`cosdip_anno` char(4) NOT NULL,
`cosdip_mese` char(2) NOT NULL,
`cosdip_cartellino` char(6) NOT NULL,
`cosdip_costo` char(6) NOT NULL,
`cosdip_importo` decimal(12,2) NOT NULL,
`cosdip_mesi` decimal(5,2) NOT NULL,
PRIMARY KEY (`cosdip_societa`,`cosdip_anno`,`cosdip_revisione`,`cosdip_cartellino`,`cosdip_costo`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
gli insert nelle tabbelle vengono fatti nel seguente modo:
insert into anag values ('1','2007','12','000571','fresilli','enza',etc);
questi gli insert per anabud
per cosdip gli insert avvengono con la stessa modalità
per cui potrei avere questa situazione:
anabud..............................................................cosdip
societa....anno....mese...cartellino.....................societa.....anno....mese....cartellino
......1.......2007....12.......000571..............................1........2007....12.........000571
......1.......2007....12.......000572..............................1........2007....12.........000572
......1.......2007....12.......000573..............................1........2007....12.........000574
......1.......2007....12.......000574..............................1........2007....12.........000575
......1.......2007....12.......000575........
come puoi vedere nei movimenti non esistono movimenti del cartellino 000573
quindi come faccio con una sola select a farmi ritornare :
socita... anno....mese...cartellino
......1.....2007.....12.......000573
che e' il cartellino che non ha movimenti nel mese
ti ringrazio per l'attenzione
ciao

lbenaglia Profilo | Guru

>gli insert nelle tabbelle vengono fatti nel seguente modo:
>insert into anag values ('1','2007','12','000571','fresilli','enza',etc);

Certo che un piccolo sforzo in più avrebbe reso il dicorso decisamente più chiaro
Visto che ti interessano solo le colonne societa, anno, mese e cartellino mi limiterò a definire le due tabelle SOLO con esse.
Il seguente codice è per SQL Server 2005 ma rispetta lo standard ANSI SQL-92, pertanto dovrebbe risultare compatibile con MySQL:

USE tempdb; CREATE TABLE anabud( anabud_societa int NOT NULL , anabud_annobud smallint NOT NULL, anabud_mese tinyint NOT NULL, anabud_cartellino char(6) NOT NULL, CONSTRAINT PK_anabud PRIMARY KEY( anabud_societa , anabud_annobud , anabud_mese , anabud_cartellino ) ); CREATE TABLE cosdip( cosdip_societa int NOT NULL, cosdip_anno smallint NOT NULL, cosdip_mese tinyint NOT NULL, cosdip_cartellino char(6) NOT NULL, CONSTRAINT PK_cosdip PRIMARY KEY( cosdip_societa , cosdip_anno , cosdip_mese , cosdip_cartellino ) ); INSERT INTO anabud VALUES(1, 2007, 12, '000571'); INSERT INTO anabud VALUES(1, 2007, 12, '000572'); INSERT INTO anabud VALUES(1, 2007, 12, '000573'); INSERT INTO anabud VALUES(1, 2007, 12, '000574'); INSERT INTO anabud VALUES(1, 2007, 12, '000575'); INSERT INTO cosdip VALUES(1, 2007, 12, '000571'); INSERT INTO cosdip VALUES(1, 2007, 12, '000572'); INSERT INTO cosdip VALUES(1, 2007, 12, '000574'); INSERT INTO cosdip VALUES(1, 2007, 12, '000575'); /* Soluzione 1: Outer Join */ SELECT A.* FROM anabud AS A LEFT JOIN cosdip AS C ON A.anabud_societa = C.cosdip_societa AND A.anabud_annobud = C.cosdip_anno AND A.anabud_mese = C.cosdip_mese AND A.anabud_cartellino = C.cosdip_cartellino WHERE C.cosdip_societa IS NULL; /* Soluzione 2: Clausola NOT EXISTS */ SELECT * FROM anabud WHERE NOT EXISTS( SELECT * FROM cosdip WHERE anabud_societa = cosdip_societa AND anabud_annobud = cosdip_anno AND anabud_mese = cosdip_mese AND anabud_cartellino = cosdip_cartellino ); /* Soluzione 3: Operatore EXCEPT */ SELECT anabud_societa , anabud_annobud , anabud_mese , anabud_cartellino FROM anabud EXCEPT SELECT cosdip_societa , cosdip_anno , cosdip_mese , cosdip_cartellino FROM cosdip; /* Output: anabud_societa anabud_annobud anabud_mese anabud_cartellino -------------- -------------- ----------- ----------------- 1 2007 12 000573 (1 row(s) affected) */ DROP TABLE anabud, cosdip;

>ti ringrazio per l'attenzione
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

vitempe Profilo | Newbie

grazie va ok
debbo chiederti un consiglio ma non oggi ti ho scocciato troppo
ciao a presto
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5