Database

Cancellare righe duplicate in Sql Server

Esistono 3 modi di cancellare righe duplicate da tabelle prive di Primary Key in Sql Server. Premesso che è molto discutibile avere una tabella priva di Primary Key... 1. Windowing WITH DupsNumberedAS (SELECT Col1, Col2, Row_Number() OVER (PARTITION BY Col1, Col2 ORDER BY Col1) AS rn FROM DupsNoPK)DELETE DupsNumberedWHERE rn > 2; 2. Surrogate key(richiede ALTER TABLE aggiungendo un IDENTITY) DELETE DupsNoPKWHERE EXISTS ( SELECT * FROM DupsNoPKAS D1 WHERE D1.Col1 = DupsNoPK.Col1 AND D1.Col2 = DupsNoPK.Col2 AND D1.PK > DupsNoPK.PK); 3. Distinct into SELECT distinct Col1, Col2 INT NoDups FROM DupsNoPK;Select Cols1, Col2 FROM NoDups; Technorati tags: Sql Server

ancora su Sql Server

Capita spesso di dover estrapolare dati aggregati del tipo: SELECT Prodotti.Codice, SUM(Quantita) as QuantitaVenduta FROM RigheOrdini JOIN Prodotti ON RigheOrdini.IDProdotto = Prodotti.ID Group By Prodotti.Codice Order by Prodotti.Codice e di dover aggiungere altre informazioni nella Select. La soluzione è: SELECT Prodotti.Codice, Prodotti.Nome, Vendite.QuantitaVenduta FROM Prodotti JOIN (SELECT IDProdotto, SUM(Quantita) as QuantitaVenduta FROM RigheOrdini Group By IDProdotto) as Vendite ON Prodotti.ID = Vendite.IDProdotto Order by Prodotti.Codice  Altra questione interessante è che è generalmente più performante: SELECT Clienti.Nome, Clienti.Cognome, Clienti.Regione FROM Clienti WHERE EXISTS (SELECT * FROM BaseCamp WHERE BaseCamp.Regione = Clienti.Regione) ORDER BY Clienti.Cognome, Clienti.Nome invece che: SELECT DISTINCT Clienti.Nome, Clienti.Cognome, Clienti.Regione FROM Clienti INNER...

Sql Server tips

Alcune annotazioni: 1. Ipotizziamo che sia presente un indice sulla colonna Col1. Non eseguire: SELECT Col2, Col3 FROM table WHERE Col1 + 30 = 130; ma SELECT Col2, Col3 FROM table WHERE Col1 = 130 - 30; In questo modo si utilizza l'indice e si evita uno inutile scan completo della tabella. 2. SELECT 'IN' WHERE 'A' NOT IN ('B', NULL); Non torna risultati perchè il valore Null non è definito e potrebbe essere 'A' 3. Oltre alle classiche wildcards più conosciute (% e _ ) esistono anche: [ ] : 'a' like '[a-g]' [^ ] : 'a'like '[^a-g]' 4. E' GOOD PRACTICE usare AS per gli aliases! Guardate cosa succede saltando...

Promemoria SQL

1. Where colonna1 BETWEEN 10 and 19 2. Where 'xxx' IN (colonna1, colonna2, colonna3) 3. Where colonna1 LIKE '[a-d]%'  or colonna2 LIKE '[^abd]%' 4. Select TOP(3) WITH TIES colonna1 FROM Tabella ORDER BY colonna1  -- può restituire più di 3 righe se ci sono più valori di colonna1 alla posizione 3. 5. Select TOP(1) colonna1 FROM tabella ORDER BY newid() -- random 6. Select TOP(1) colonna1 FROM tabella TableSample (10 Percent) ORDER BY newid() -- random con migliori performance dato che seleziona una pagina di una tabella Technorati tags: Sql Server,  Database

W le query

In questi anni le tecnologie Microsoft si sono evolute (anche fin troppo velocemente, tanto che non è possibile assimilare tutto). Servono anni per appropriarsi di una tecnologia eppure tutto adesso si sviluppa nel giro di poco. Oltre alle tecnologie abbiamo visto nascere nuovi pattern. Devo ancora approfondire ASP.NET MVC (ma gli strumenti non me lo consentono) però tutti questi linq, entity, etc non mi hanno entusiasmato. Per non parlare poi delle soluzioni delle aziende: interi DAL sviluppati e poi accantonati. E' interessante conoscere i pattern e giusto svilupparli ma (la seguente affermazione dipende dal contesto): "Io preferisco le query sql"  Eh si, di...

Azzerare il contatore

Su sqlserver: DBCC CHECKIDENT('nometabella',reseed,0) Technorati tags: Sql Server,  Database

Record duplicati

Su sql server per controllare l'esistenza di record duplicati. SELECT col1, col2, count(*) AS conteggio FROM tabella_demo GROUP BY col1, col2 HAVING count(*) > 1   Technorati tags: Sql Server,  Database