Query difficile!!!!

martedì 24 novembre 2009 - 21.06

Geronimo79 Profilo | Junior Member

Salve a tutti, sono nuovo iscritto e innanzitutto mi complimento con tutti coloro che hanno reso e renderanno sempre migliore questo splendido sito....(spero di contribuire tecnicamente anche io, per quello che posso, essendo un neofita della programmazione vb.net )....Sono alle prese con una query Sql (uso Sql server 2005 express) che non riesco in nessun modo a far funzionare...Vi schematizzo subito il problema qual'è. Ho due tabelle così composte:

tabella a (id,nome,cognome) e contiene il seguente record: id=1, nome=mario, cognome=rossi
tabella b (riferimento,id,nome,cognome)

a questo punto, procedo nel fare una query di semplice inserimento record nel campo "riferimento" della tabella b e inserisco il numero es. "50"......e fin quì tutto ok....

adesso vorrei creare una query che mi vada a copiare i record della tabella a (id,nome,cognome) nella tabella b (id,nome,cognome) quindi vorrei che la tabella "b" alla fine abbia come risultato il seguente:

tabella b

riferimento = 50
id = 1
nome = mario
cognome = rossi


In pratica il concetto è: inserisci "id=1", "nome=mario", "cognome=rossi" dalla tabella "a" alla tabella "b"......dove il campo "riferimento della tabella "b" è = 50
ma è più semplice a dirsi che à farsi.....ho fatto diverse prove ma nn ho idea di come sviluppare una query del genere. Spero di essere stato il più chiaro possibile...Ringrazio anticipatamente coloro i quali mi aiuteranno nella risoluzione di questo difficile problema.Mark.






lbenaglia Profilo | Guru

>Salve a tutti, sono nuovo iscritto e innanzitutto mi complimento
>con tutti coloro che hanno reso e renderanno sempre migliore
>questo splendido sito....

Ciao Mark,

Grazie a nome di tutti gli utenti di DNH e benvenuto!

>Ho due tabelle così composte:
>
>tabella a (id,nome,cognome) e contiene il seguente record: id=1,
>nome=mario, cognome=rossi
>tabella b (riferimento,id,nome,cognome)
>
>a questo punto, procedo nel fare una query di semplice inserimento
>record nel campo "riferimento" della tabella b e inserisco il
>numero es. "50"......e fin quì tutto ok....
Cosa rappresenta la colonna riferimento?
Qual è la Primary Key della tabella b?

>adesso vorrei creare una query che mi vada a copiare i record
>della tabella a (id,nome,cognome) nella tabella b (id,nome,cognome)
>quindi vorrei che la tabella "b" alla fine abbia come risultato
>il seguente:
>
>tabella b
>
>riferimento = 50
>id = 1
>nome = mario
>cognome = rossi
>
>
>In pratica il concetto è: inserisci "id=1", "nome=mario", "cognome=rossi"
>dalla tabella "a" alla tabella "b"......dove il campo "riferimento
>della tabella "b" è = 50
>ma è più semplice a dirsi che à farsi...
A parte il significato della colonna riferimento che mi sfugge, puoi ottenere il risultato che cerchi definendo una tabella derivata che restituisca la riga da aggiornare ed eseguire il comando di UPDATE su di essa.
Dato che utilizzi SQL Server 2005 ti mostrerò un esempio basato su una Common Table Expression (CTE):

USE tempdb; CREATE TABLE dbo.a( id int NOT NULL PRIMARY KEY, nome varchar(10) NOT NULL, cognome varchar(10) NOT NULL ); CREATE TABLE dbo.b( riferimento int NOT NULL, id int NULL, nome varchar(10) NULL, cognome varchar(10) NULL ); INSERT dbo.a VALUES(1, 'mario', 'rossi'); INSERT dbo.b(riferimento) VALUES(50); INSERT dbo.b(riferimento) VALUES(60); WITH CTE_GetRowToUpdate AS ( SELECT id, nome, cognome FROM dbo.b WHERE riferimento = 50 ) UPDATE CTE_GetRowToUpdate SET id = a.id, nome = a.nome, cognome = a.cognome FROM dbo.a; SELECT * FROM dbo.b; /* Output: riferimento id nome cognome ----------- ----------- ---------- ---------- 50 1 mario rossi 60 NULL NULL NULL (2 row(s) affected) */ DROP TABLE dbo.a, dbo.b;

>Ringrazio anticipatamente coloro i quali mi aiuteranno
>nella risoluzione di questo difficile problema.
Prego.

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

Geronimo79 Profilo | Junior Member

Innanzitutto grazie della risposta.....

Il progetto riguarda un concessionario di auto che noleggia le autovetture...quindi le autovetture stesse entrano ed escono dal concessionario...

In realtà il problema è questo...ma nn l'ho scritto prima per motivi di semplicità...

ho due tabelle.......

Automobili (id,Marca,Targa)
Composizione Auto (id,optional auto, numero identificativo)

n.b. Automobili colonna "id" chiave primaria autoincrementale...., Composizione Auto colonna "id" chiave esterna legati da inner join....

A questo punto il mio database avrà una relazione uno-molti perchè lo strutturo secondo la logica

tabella Automobili
id=1 marca=ferrari targa=12345

tabella Composizione Auto
id=1 optional=fari xeno numero identificativo=98098898988
id=1 optional=vernice nera numero identificativo=98076666655
id=1 optional=cerchi lega numero identificativo=98065353534

Fin quì tutto ok........

A questo punto dovrei creare uno "storico" fatture, cioè tabelle a parte dove memorizzare tutte le varie fatture che ho emesso.....e creare un report per successiva stampa..


Mi creo 3 tabelle

Fattura 1 (numero fattura,data fattura) fattura 2 (numero fattura,id,marca,targa) fattura 3 (numero fattura,id,optional,numero identificativo)

n.b. la tabella fattura 1 colonna "numero fattura" è chiave primaria, le altre 2 tabelle che hanno colonna "numero fattura" sono chiavi esterne...e creo un inner join.....

Adesso salvo un dato quasiasi nella fattura 1......poi devo prelevare i dati dalle tabelle "automobili" e "composizione auto" e inserirli rispettivamente nelle tabelle "fattura 2" e "fattura 3".........a questo punto inserire i dati nella fattura 3 è problematico poichè deve avere la colonna numero fattura identica alla tabella fattura 1 e fattura 2 e id identico alla tabella fattura 2 al fine di garantire il join e la corretta visualizzazione sul report...poichè per ogni id della fattura 2 possono corrispondere 100 record dalla fattura 3....

In linea di massima il mio progetto è questo....spero di aver chiarito meglio l'idea....

Grazie a presto...Mark




























Geronimo79 Profilo | Junior Member

Potresti gentilmente indicarmi la query da inserire nel mio progetto sottoforma di codice anzichè sottoforma di CTE...??? te ne sarei grato.....

es:

Dim Objconnection As New SqlConnection("Data Source=.\SQLExpress;Integrated Security=true;AttachDbFilename=|DataDirectory|\databaseauto.mdf;User Instance=true")
Dim objcommand As SqlCommand = New SqlCommand()
Objconnection.Open()
objcommand.Connection = Objconnection
objcommand.CommandText = "query da inserire......."
objcommand.ExecuteNonQuery()
Objconnection.Close()


Spero di non pretendere troppo....Grazie...Mark.


lbenaglia Profilo | Guru

>Potresti gentilmente indicarmi la query da inserire nel mio progetto
>sottoforma di codice anzichè sottoforma di CTE...???
Perché? Non va bene l'esempio che ti ho fatto?
Lato client puoi tranquillamente copiare ed incollare quello.

>Spero di non pretendere troppo....Grazie...Mark.
Prego.

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

Geronimo79 Profilo | Junior Member

Perdonami.....ma essendo un neofita della programmazione non sò usare bene le CTE e mi trovo meglio, o comunque sono + pratico nell'utillizare il codice SQL secondo quell'esempio che ho postato....

lbenaglia Profilo | Guru

>Perdonami.....ma essendo un neofita della programmazione non
>sò usare bene le CTE e mi trovo meglio, o comunque sono + pratico
>nell'utillizare il codice SQL secondo quell'esempio che ho postato....
Purtroppo quell'esempio non mi è chiaro.
Perché hai bisogno di definire 3 tabelle fatture?

Ciao!

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

Geronimo79 Profilo | Junior Member

Hai ragione scusami…effettivamente mi sono espresso male io…..quello che non riesco a fare è tutto ciò….(parto dal classico esempio….per farla breve)


Se la tabella “a” contiene es. 3 record con “id=10” come di seguito:

id nome cognome
10 mario rossi
10 roberto verdi
10 antonio neri

E la tabella “b” è strutturata in questo modo:

Riferimento id nome cognome
50 -- ------ -----------
50 -- ------ -----------
50 -- ------ -----------

Vorrei inserire nella tabella “b” riferimento=50 tutti gli id=10 della tabella “a”….

Ovvero vorrei questo risultato:

Riferimento id nome cognome
50 10 mario rossi
50 10 roberto verdi
50 10 antonio neri


Ho provato questo codice:

insert into tabellab (id,nome,cognome)(select id,nome,cognome from tabellaa where id='10')

Ma il risultato che ottengo è questo:

Riferimento id nome cognome
50 -- ------ -----------
50 -- ------ -----------
50 -- ------ -----------
-- 10 mario rossi
-- 10 roberto verdi
-- 10 antonio neri



Ma ovviamente nn mi inserisce i 3 record della tabella “a” nella tabella “b” in corrispondenza di riferimento=50…poiché, come è chiaramente visibile, manca un “where tabellab=50” che nn riesco a inserire in questo codice….
Grazie x l’interessamento…spero di trovare una soluzione a questo problema…..Un saluto.

lbenaglia Profilo | Guru

>Hai ragione scusami…effettivamente mi sono espresso male io…..quello
>che non riesco a fare è tutto ciò….(parto dal classico esempio….per
>farla breve)
>
>
>Se la tabella “a” contiene es. 3 record con “id=10” come di seguito:
>
>id nome cognome
>10 mario rossi
>10 roberto verdi
>10 antonio neri
>
>E la tabella “b” è strutturata in questo modo:
>
>Riferimento id nome cognome
>50 -- ------ -----------
>50 -- ------ -----------
>50 -- ------ -----------

Qual è la Primary key di queste due tabelle?

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

Geronimo79 Profilo | Junior Member

scusami......solo la colonna "riferimento" è chiave esterna di un'altra tabella...in pratica queste 2 tabelle nn hanno chiave primaria... la query che devo far la applico soltanto a queste 2 tabele...la tabella con la chiave primaria stà "per conto suo" diciamo...devo x forza articolare la query così....spero davvero in una soluzioe...
Un saluto e grazie ancora...

Geronimo79 Profilo | Junior Member

Ho risolto......!!!!!!!!!!!!!!

Ti spiego x bene cosa ho fatto...prendendo un'altro progetto che avevo fermo e in cui avevo più o meno lo stesso problema.....

In realtà ho 5 tabelle......

1° tabella= id,materiali,codice materiali
2° tabella= id,composizione materiale,codice composizione materiale

campo "id" 1° tabella è chiave primaria, campo id 2° tabella chiave esterna quindi collegate con inner join....con relazione uno a molti.....

Fin quì nulla di strano (l'ho fatta coerentemente questa :-) tabella)

Quindi mi troverei ad avere dei record così composti:

tabella 1

id=1
materiali=computer portatile
codice materiali=20900

tabella 2

id=1
composizione materiali=mouse
codice composizione materiale=78888

id=1
composizione materiali=modem
codice composizione materiale=78877

id=1
composizione materiali=penna usb
codice composizione materiale=786766

ecc.ecc..



Adesso dovrei creare uno storico ricevute in quanto è un negozio che noleggia pc....e il materiale entra e esce in continuazione dal negozio...


Mi creo altre 3 tabelle.....

3° tabella
n° fattura,data fattura...ecc.....

4° tabella
n° fattura,id,materiali,codice materiali

5° tabelle
n°fattura,id,composizione materiali,codice composizione materiali

(campo n° fattura della 3° tabella chaive primaria, campo n° fattura della 4°- 5° tabella sono chiave esterne)...

Premetto che entrata/uscita materiale è gestita da lettore barcode con seriale RS232....

Cosa faccio...mi salvo i dati nella 3° tabella, mi salvo i dati nella 4° (estrapolandoli dalla 1° in quanto ovviamente già sono stati inseriti in precedenza)......il grandissimo problema è inserire i dati nella 5° tabella in quanto devo avere il campo "n° fattura" uguale alla 3° e 4° tabella....ed in più anche il campo "id" corrispondente alla 4° tabella per garantire soprattutto sul report una corretta visualizzazione di dati sempre del tipo "uno-molti"....ma nn mancano le difficoltà poichè potrei ritrovarmi sulla tabella 5 molti record duplicati ma appartenenti a fatture diverse...e devo per forza aggrapparmi, per evitare grossi casini, all'unico campo univoco che ho cioè "n° ricevuta"....e quà è il grosso macello!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! in quanto non è facile gestire una query del genere.....

Ho risolto in questa maniera.........l'unica....ma molto efficace.....


La 5° tabella ammette tutti valori "null"...allora ho fatto in questa maniera...


tabella 3°

n°fattura=50
data fattura=10.10.2009

tabella 4°
id=1
materiale=computer portatile
codice materiale=20900

sulla tabella 5° procedo con un insert così (prelevando i record dalla 2° tabella!!!!):

insert into tabella5 (campo1,campo2,eccc)(select campo1,campo2,ecc from tabella2 where id='1') ed ottengo questo schema:

N°fattura-id-composizione m.-codice comp.mat.

-- -1 -mouse -78877
-- -1 -modem -78987
-- -1 -penna usb -766777

Devo assegnare a questo punto x forza il numero della fattura corrispondente a questo materiale e alla composizione del materiale che esce!!!!!!!!!!!!!
L'unica cosa che posso fare è inserire "1" alla colonna N°fattura facendo un "UPDATE" dei valori "NULLI" in questo modo:

(update tabella5 set n°fattura=1 where n°fattura is null)

Quindi ogni volta che inserisco record multipli nella 5° tabella la colonna N°fattura mi rimane sempre con valori NULL e riesco a coprirla in questo modo......

Spero di aver illustrato nel migliore dei modi il problema....non essendo un "guru" della programmazione ovviamente il tutto poteva essere articolato sicuramente in maniera + efficace e meno contorta.....Accetto ovviamente qualsiasi critica e miglioria al progetto....
Ti ringrazio comunque x l'interessamento che hai avuto nei miei riguardi....grazie ed a presto...(non mancherò di chiedere, e per quello che potrò magari anche dare, svariati consigli e soluzioni su questo splendido sito)
Ciao...Mark...
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5