'calcolare' campo db

venerdì 17 luglio 2009 - 11.31

bolla111 Profilo | Senior Member

ciao a tutti...
io ho una tabella chiamata nominativo composta da id,nome,responsabile
il campo responsabile è numerico...
la tabella nominativi oltre ad essere composta dalle varie persone, è anche composta dai responsabili stessi, quindi il campo responsabile è riferito al campo id della stessa tabella (non so se mi spiego)
faccio 1 esempio
id nome responsabile
1 pippo 5
2 pluto 5
3 tizio 6
4 caio 0
5 bello null
6 brutto null

le persone con id = 5 e 6 sono responsabili, infatti i primi 2 hanno come responsabile "bello", il terzo invece "brutto", il quarto non ha responsabile...


quello che voglio sapere è se è possibile, attraverso una query, richiamare i campi della tabella "nominativi" visualizzando il nome del responsabile, invece che il codice...

grazie

iif Profilo | Expert

Se fai due tabelle è meglio

bolla111 Profilo | Senior Member

purtroppo non posso...perchè sono delle modifiche che devo fare ad un lavoro che non è mio...se no l'avrei già fatto...
hai qlch soluzione?

iif Profilo | Expert

crea una query dove relazioni la tabella nominativi con la tabella nominativi1.

bolla111 Profilo | Senior Member

ok...è proprio quello che non so fare...mi fai un esempio?

iif Profilo | Expert

SELECT *
FROM nominativi INNER JOIN
nominativi AS nominativi_1 ON nominativi.ID = nominativi_1.ID

dinoxet Profilo | Senior Member

questa vista visualizza solo i tuoi responsabili :
select * from nominativi (where responsabile is null)
la puoi joinare e quindi visualizzare il nome del responsabile invece del codice


DINOXET
__________________________________________
impossible is only a word

bolla111 Profilo | Senior Member

la soluzione di iif mi piace...solo che non so ancora come far visualizzare i nomi e non i codici...


la soluzione di dinoxet non la so fare...ho già provato con una vista, ma ho abbandonato...se riesci a postarmi un esempio mi fai un piacere...


grazie a entrambi

iif Profilo | Expert

SELECT nominativo
FROM nominativi INNER JOIN
nominativi AS Responsabili ON nominativi.ID = Responsabili.IDResponsabile

Se posti il dump della tabella posso essere piu preciso

bolla111 Profilo | Senior Member

cosa? scusa ma non sono molto afferrato...

alx_81 Profilo | Guru

>cosa? scusa ma non sono molto afferrato...
scusate se intervengo. Se vi dovesse interessare questo è un metodo per farsi la gerarchia ricorsivamente. Secondo me avete tutto quello che vi serve:
USE tempdb; GO CREATE TABLE dbo.Nominativi ( ID int NOT NULL PRIMARY KEY CLUSTERED , Nome varchar(30) NOT NULL , IDParent int NULL ) GO ALTER TABLE dbo.Nominativi ADD CONSTRAINT FK_Self_Nominativi FOREIGN KEY (IDParent) REFERENCES dbo.Nominativi (ID) GO INSERT INTO dbo.Nominativi (ID, Nome, IDParent) VALUES (1, 'BOSS 1', NULL) INSERT INTO dbo.Nominativi (ID, Nome, IDParent) VALUES (2, 'BOSS 2', NULL) INSERT INTO dbo.Nominativi (ID, Nome, IDParent) VALUES (3, 'Tizio', 1) INSERT INTO dbo.Nominativi (ID, Nome, IDParent) VALUES (4, 'Caio', 1) INSERT INTO dbo.Nominativi (ID, Nome, IDParent) VALUES (5, 'Bello', 2) INSERT INTO dbo.Nominativi (ID, Nome, IDParent) VALUES (6, 'Brutto', 2) INSERT INTO dbo.Nominativi (ID, Nome, IDParent) VALUES (7, 'Medio', 6) INSERT INTO dbo.Nominativi (ID, Nome, IDParent) VALUES (8, 'Ultimo', 7) INSERT INTO dbo.Nominativi (ID, Nome, IDParent) VALUES (9, 'Altro', 4) GO ;WITH Gerarchia AS ( SELECT ID , Nome , IDParent , Livello = 1 FROM dbo.Nominativi WHERE IDParent IS NULL -- membro di ricorsione UNION ALL SELECT U.ID , U.Nome , U.IDParent , Livello = G.Livello + 1 FROM dbo.Nominativi U JOIN Gerarchia G ON G.ID = U.IDParent ) SELECT G.ID , REPLICATE('----|', G.Livello - 1) + SPACE(1) + G.Nome , NomePadre = ISNULL(N.Nome, 'Nessuno') FROM Gerarchia G LEFT JOIN dbo.Nominativi N ON N.ID = G.IDParent GO DROP TABLE dbo.Nominativi GO
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

bolla111 Profilo | Senior Member

ho una confusione in testa...non ci sto capendo niente...

iif Profilo | Expert

Allora, un passo alla volta.
Puoi inviarmi la struttura della tabella?

bolla111 Profilo | Senior Member

vuoi tutti i campi della tabella? sono tanti e secondo me ti sono inutili cmq...in teoria basta basarci sulla tabella d'esempio che ho scritto all'inizio...

iif Profilo | Expert

il codice respoonsabile è un campo a parte o è scritto nel nominativo?

bolla111 Profilo | Senior Member

è un campo a parte

iif Profilo | Expert

Script per la tabella
USE [LAB]
GO
/****** Object: Table [dbo].[Nominativi] Script Date: 07/17/2009 15:02:55 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Nominativi](
[ID] [int] NOT NULL,
[Nome] [varchar](30) NOT NULL,
[IDParent] [int] NULL,
PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[Nominativi] WITH CHECK ADD CONSTRAINT [FK_Self_Nominativi] FOREIGN KEY([IDParent])
REFERENCES [dbo].[Nominativi] ([ID])
GO
ALTER TABLE [dbo].[Nominativi] CHECK CONSTRAINT [FK_Self_Nominativi]


Prova:

SELECT dbo.Nominativi.ID, Responsabili.Nome AS Resp, dbo.Nominativi.IDParent, dbo.Nominativi.Nome
FROM dbo.Nominativi INNER JOIN
dbo.Nominativi AS Responsabili ON dbo.Nominativi.IDParent = Responsabili.ID

bolla111 Profilo | Senior Member

ok...non mi è chiara una cosa però: nella select xkè hai messo nominativi.ID e nominativi.IDparent?

alx_81 Profilo | Guru

>ho una confusione in testa...non ci sto capendo niente...
Quello che hai chiesto è una self join e la risposta l'hai ricevuta da iif. Si tratta di usare la stessa tabella due volte per ricavare da un IDResponsabile il suo nominativo.
Quello che ti ho scritto io è un metodo molto utile per creare la gerarchia, e in più ho aggiunto la self join. Se sostituisci i nomi dei tuoi campi e delle tabelle allo script che ti ho passato io, hai tutto.
Credimi, è un copia incolla ed un rename. E' più semplice di quanto sembri..

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

iif Profilo | Expert

era un esempio, se vuoi puoi sostituirlo, era a titolo esemplificativo.

bolla111 Profilo | Senior Member

cmq io questa query dovrei inserirla in un sqldatasource...
con tutto quello che mi hai scritto sopra la query che ci devo fare?

iif Profilo | Expert

era solo un modo per farti capire la struttura che ho utilizzato, tutto qui.

alx_81 Profilo | Guru

>cmq io questa query dovrei inserirla in un sqldatasource...
>con tutto quello che mi hai scritto sopra la query che ci devo fare?
dovresti scrivere una stored procedure, ovvero una procedura in cui fai tutte "quelle cose".
Poi al SqlDataSource gli dai come SelectCommandType = "StoredProcedure" e nel SelectCommand metti il nome della Stored procedure.
Per come crearla, leggi qui http://msdn.microsoft.com/it-it/library/ms187926.aspx.
Usare le stored procedure è molto vantaggioso in termini di security, modularità, prestazioni.

Se non ci salti fuori siamo qui per te

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

iif Profilo | Expert

Credo che il quesito posto da bolla111 è relativo solo alla query da inserire nel sqldatasource, niente di che.

bolla111 Profilo | Senior Member

appunto...io credo che la queri che mi hai scritto tu (iif), vada bene...solo che siccome il campo "riferimento" può essere impostato oppure a NULL, la query potrebbe non essere eseguita...

iif Profilo | Expert

se la esegui vedrai solo i record che trovano corrispondenza e non quelli che sono null.

alx_81 Profilo | Guru

>appunto...io credo che la queri che mi hai scritto tu (iif),
>vada bene...solo che siccome il campo "riferimento" può essere
>impostato oppure a NULL, la query potrebbe non essere eseguita...
Vorrei puntualizzare una cosa. Quello che ti ha consigliato iif è corretto. Nessuno dice il contrario.
Ho aggiunto, che se ti dovesse servire anche la gerarchia (perchè in alcuni casi viene comodo), hai la soluzione che ti ho indicato.
In aggiunta ancora, ti consiglio (e lo consiglio sempre) di usare le stored procedure.
Poi ognuno è libero di seguire la strada che più preferisce. Io devo consigliare quello che credo sia meglio


--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

bolla111 Profilo | Senior Member

funziona!!!! avevo sbagliato una cosa e basta...
grande iif.....e grazie a entrambe x la pazienza...vi ho tirati matti...
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