Newsgroup: it.comp.software.database
Titolo: ordinamento SQL

Salve a tutti.
Ho una tabella con i seguenti campi:
CODICE
NOME
CODICE-PRECEDENTE
Codice precedente contiene il riferimento ad un codice della stessa
tabella che indica quale record è da considerarsi in ordinamento
precedente a quello corrente.
Ora, l'ordinamento di questa tabella utilizzando come criterio il campo
codice-precedente, si può fare in SQL oppure sono costretto a farlo
tramite codice nella mia applicazione?
Grazie

 Grazie
marc.

COD - NOME - CODPRECEDENTE
1 - Giuseppe - 3
2 - Mario - 0
3 - Lucia - 2
4 - Francesco - 5
5 - Sonia - 1
Elenco ordinato:
Mario
Lucia
Giuseppe
Sonia
Francesco


Ciao Stefano,
non ho capito, mi spieghi la logica di quell'ordinamento?
Grazie,
-- 
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org

stefan...@libero.it
 ha scritto:

Mah.. con l'esempio che segue ottieni il risultato ma non è certo un 
capolavoro, mi sa però che ogni strategia [client o server che sia] 
richieda pesanti funzioni ricorsive... Forse si potrebbe ripensare 
l'architettura per facilitare l'estrazione richiesta.
use tempdb
go
create table test(Cod int primary key,Nome Varchar(10),
CodPrecedente int constraint fk1 foreign key references test(Cod))
go
insert into test values(2,'Mario',null)
insert into test values(3,'Lucia',2)
insert into test values(1,'Giuseppe',3)
insert into test values(5,'Sonia',1)
insert into test values(4,'Francesco',5)
go
create function f_GetPosition(@Cod int)
returns int as
begin
declare @Prec int
select @Prec=CodPrecedente from test where Cod=@Cod
if @Prec is null return 0
return 1+dbo.f_GetPosition(@Prec)
end
go
select *,Cod+CodPrecedente
from test
order by dbo.f_GetPosition(Cod)
go
drop function f_GetPosition
drop table test
marc.


Ciao Stefano,
il tuo problema e' modellato dalla teoria dei grafi con le liste di 
adiacenza (adjacency list model).
In sql non lo puoi risolvere con una query secca.
In rete trovi molto sull'argomento, soprattutto in inglese.
La soluzione dipende dal tuo RDBMS.
Un esempio con sql server:
http://www.yafla.com/papers/sqlhierarchies/sqlhierarchies.htm
-- 
Fabrizio Magni
fabrizi...@mycontinent.com
replace mycontinent with europe

 Grazie,
Mi era sfuggito che si trattava di una query ricorsiva.
SQL Server 2005 permette di risolvere elegantemente problemi come questo 
utilizzando una Common Table Expression ricorsiva:
USE tempdb;
GO
/* Definisco la tabella dbo.myTable */
CREATE TABLE dbo.myTable(
COD int NOT NULL PRIMARY KEY,
NOME varchar(10) NOT NULL,
CODPRECEDENTE int NOT NULL
);
GO
/* La popolo */
INSERT dbo.myTable VALUES(1, 'Giuseppe', 3);
INSERT dbo.myTable VALUES(2, 'Mario', 0);
INSERT dbo.myTable VALUES(3, 'Lucia', 2);
INSERT dbo.myTable VALUES(4, 'Francesco', 5);
INSERT dbo.myTable VALUES(5, 'Sonia', 1);
GO
/* CTE ricorsivo */
WITH RecCTE(COD, NOME) AS
(
    SELECT COD, NOME
    FROM dbo.myTable
    WHERE CODPRECEDENTE = 0
    UNION ALL
    SELECT T.COD, T.NOME
    FROM dbo.myTable T JOIN RecCTE R
    ON T.CODPRECEDENTE = R.COD
)
SELECT NOME
FROM RecCTE;
GO
/* Output:
NOME
----------
Mario
Lucia
Giuseppe
Sonia
Francesco
(5 row(s) affected)
*/
/* Pulizia */
DROP TABLE dbo.myTable;
Ciao!
