PDA

View Full Version : [SQL Server] Aiuto linguaggio SQL


almaxy
28-01-2009, 17:28
Ho un piccolo problemino con una tabella.
Faccio un esempio banalissimo. Ho una tabella con 2 campi ID, Numeri
ID Numeri
1 2
2 4
3 7
4 11
5 13
6 1000

E' possibile creare una Vista o query che mi restituisca in uscita una colonna che abbia tutti i numeri da 1 a 1000 ad esclusione dei numeri 2, 4, 7, 11, 13, 1000 ? Ed un'atra vista che mi dia il primo numero libero? POSSIBILE?
In casi estremi mi potrebbe andare bene anche una Stored Procedure solo che non le conosco se non minimamente

GRAZIE 1000 :)

P.S. mi serve per una pagina ASP, potrei risolvere applicando delle piccole tecniche di programmazione solo che per elaborare il tutto impiega un pò di tempo e quindi non va bene

almaxy
29-01-2009, 00:10
:help:

CozzaAmara
29-01-2009, 12:26
Giuro che non ho capito benissimo.
Potresti contestualizzare meglio la cosa nell'ambito del tuo progetto?

almaxy
04-02-2009, 16:28
Giuro che non ho capito benissimo.
Potresti contestualizzare meglio la cosa nell'ambito del tuo progetto?

Vedi la colonna Numeri.
Io vorrei una Vista che mi restituisca:
1,3,5,6,8,9,10,12,14, ecc....

Sono stato un pochino chiaro? :rolleyes:
Grazie 1000

shinya
04-02-2009, 17:32
In oracle io farei cosi... ma sql server purtroppo non lo conosco, dovresti trovare un sostituto per il costrutto 'connect by' che non è sql standard.

Cmq, per quello che può servire...


select level n
from dual
where level not in( select numeri
from t -- <-- questa è la tua tabella!
where numeri is not null )
connect by level <= 1000

almaxy
04-02-2009, 18:17
Grazie per la risposta ma quello che hai postato è tutto linguaggio SQL?
A parte 'connect by', perchè ci capisco poco

gugoXX
04-02-2009, 19:04
Grazie per la risposta ma quello che hai postato è tutto linguaggio SQL?
A parte 'connect by', perchè ci capisco poco

Si', e' SQL, ma non standard, non puoi usarlo sotto SqlServer. E' una elegante implementazione per Oracle.

Sotto SqlServer puoi fare cosi'.
dichiari una table function

CREATE FUNCTION [dbo].[ufn_GenerateIntegers] ( @MaxValue INT )
RETURNS @Integers TABLE ( [IntValue] INT )
AS
BEGIN
DECLARE @Index INT
SET @Index = 1
WHILE @Index <= @MaxValue
BEGIN
INSERT INTO @Integers ( [IntValue] ) VALUES ( @Index )
SET @Index = @Index + 1
END

RETURN
END


Che userai poi cosi'

SELECT IntValue FROM ufn_GenerateIntegers(1000) as ut
WHERE ut.IntValue NOT IN (SELECT valore FROM MiaTabella)


Per il minimo ovviamente

SELECT Min(IntValue) FROM ufn_GenerateIntegers(1000) as ut
WHERE ut.IntValue NOT IN (SELECT valore FROM MiaTabella)

almaxy
05-02-2009, 09:17
GRAZIE 1000
Mi sei stato utile :D