/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
MSSQL: Hvilke værdier findes ikke i tabel
Fra : Jesper Stocholm


Dato : 10-02-02 18:32

Jeg har en række værdier, som jeg gerne vil undersøge for manglende
forekomst i en række i en tabel

Mine data kunne være

67,54,87,98,34,65

Disse data genereres af en applikation - eller gives som input fra en
bruger.

Jeg har behov for checke, at alle disse tal er tilstede i en kolonne i en
tabel.

Jeg ville egentlig gerne lade min db ordne dette for mig, så den evt
returnerede de værdier fra stregen, der _ikke_ modsvares af en værdi i
tabellen.

Jeg har prøvet at få det til at virke ... men jeg er ikke helt i mål
endnu.

Mit sidste forsøg på en SQL - der dog ikke virker - er :

SELECT
*
FROM
(67,54,87,98,34,65) as TempCheck
WHERE id NOT IN
(SELECT prnumber FROM table where number = 4)

.... men hvad skal SQL være i stedet ?

pft,

--
Jesper Stocholm - http://stocholm.dk

Synes du også, at Britney trods alt er meget lækker - men dog
på grænsen til det kvalmende ? http://stocholm.dk/britney.txt

 
 
Peter Lykkegaard (10-02-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 10-02-02 19:50


"Jesper Stocholm" <spam200201@stocholm.dk> wrote in message
news:Xns91B1BC947119Bspamstocholmdk@192.38.208.81...
> Jeg har en række værdier, som jeg gerne vil undersøge for manglende
> forekomst i en række i en tabel
>
> Mine data kunne være
>
> 67,54,87,98,34,65
>
> Disse data genereres af en applikation - eller gives som input fra en
> bruger.
>
> Jeg har behov for checke, at alle disse tal er tilstede i en kolonne i en
> tabel.
>
Følgende er lovlige

select id from tblTest where id in (67,54,87,98,34,65)
select id from tblTest where id not in (67,54,87,98,34,65)

Du kan evt lave noget CURSOR gymnastik i en stored procedure
Men det nemmeste (også for MSSQL) er vel egentlig at lave en kombination af
en Select statement og en class, som du så kan bruge til at teste for
manglende data...

mvh/Peter Lykkegaard






Jesper Stocholm (10-02-2002)
Kommentar
Fra : Jesper Stocholm


Dato : 10-02-02 22:16

Peter Lykkegaard wrote in news:a46f6h$hlk$1@news.net.uni-c.dk:

>
> "Jesper Stocholm" <spam200201@stocholm.dk> wrote in message
> news:Xns91B1BC947119Bspamstocholmdk@192.38.208.81...
>> Jeg har en række værdier, som jeg gerne vil undersøge for manglende
>> forekomst i en række i en tabel
>>
>> Mine data kunne være
>>
>> 67,54,87,98,34,65
>>
>> Disse data genereres af en applikation - eller gives som input fra en
>> bruger.
>>
>> Jeg har behov for checke, at alle disse tal er tilstede i en kolonne
>> i en tabel.
>>
> Følgende er lovlige
>
> select id from tblTest where id in (67,54,87,98,34,65)
> select id from tblTest where id not in (67,54,87,98,34,65)
>

tjoeh ... men mit problem er jo bare, at jeg skal ckecke "den anden
vej" :)

Sådan et skud på størrelsesordenen er, at jeg skal checke en 10-20 givne
værdier for tilstedeværelse i en kolonne med vel i snit 100-200 rækker.

> Du kan evt lave noget CURSOR gymnastik i en stored procedure
> Men det nemmeste (også for MSSQL) er vel egentlig at lave en
> kombination af en Select statement og en class, som du så kan bruge
> til at teste for manglende data...
>

hmmm ... ok ... har du nogle pointere til hvor jeg kan læse mere om dette
.... evt i BOL ? Det problem jeg skal løse er egentligt ikke så stort -
jeg vil tro, at det skal bruges max en 10-15 gange i løbet af en uge af
noget administrations-personale - men jeg ville jo gerne lave det "på den
rigtige måde" i stedet for at høker-programmere mig ud af det.

:)

--
Jesper Stocholm - http://stocholm.dk

Synes du også, at Britney trods alt er meget lækker - men dog
på grænsen til det kvalmende ? http://stocholm.dk/britney.txt

Peter Lykkegaard (12-02-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 12-02-02 23:07


"Jesper Stocholm" <spam200201@stocholm.dk> wrote in message
news:Xns91B1E2763CCD5spamstocholmdk@192.38.208.81...
> Peter Lykkegaard wrote in news:a46f6h$hlk$1@news.net.uni-c.dk:
>
> >
> > "Jesper Stocholm" <spam200201@stocholm.dk> wrote in message
> > news:Xns91B1BC947119Bspamstocholmdk@192.38.208.81...
> >> Jeg har en række værdier, som jeg gerne vil undersøge for manglende
> >> forekomst i en række i en tabel
> >>
> >> Mine data kunne være
> >>
> >> 67,54,87,98,34,65
> >>
> >> Disse data genereres af en applikation - eller gives som input fra en
> >> bruger.
> >>
> >> Jeg har behov for checke, at alle disse tal er tilstede i en kolonne
> >> i en tabel.
> >>
> > Følgende er lovlige
> >
> > select id from tblTest where id in (67,54,87,98,34,65)
> > select id from tblTest where id not in (67,54,87,98,34,65)
> >
>
> tjoeh ... men mit problem er jo bare, at jeg skal ckecke "den anden
> vej" :)
>
> Sådan et skud på størrelsesordenen er, at jeg skal checke en 10-20 givne
> værdier for tilstedeværelse i en kolonne med vel i snit 100-200 rækker.
>
> > Du kan evt lave noget CURSOR gymnastik i en stored procedure
> > Men det nemmeste (også for MSSQL) er vel egentlig at lave en
> > kombination af en Select statement og en class, som du så kan bruge
> > til at teste for manglende data...
> >
>
> hmmm ... ok ... har du nogle pointere til hvor jeg kan læse mere om dette
> ... evt i BOL ? Det problem jeg skal løse er egentligt ikke så stort -
> jeg vil tro, at det skal bruges max en 10-15 gange i løbet af en uge af
> noget administrations-personale - men jeg ville jo gerne lave det "på den
> rigtige måde" i stedet for at høker-programmere mig ud af det.
>
Jeg ville nu hænge min hat på noget 3-tier setup
Men det kan med nogle sværdslag lade sig gøre vha T-SQL

Jeg kan ikke lige se mig ud af hvordan du kan overføre dit array som
parameter og bruge den direkte i en select clause - så du skal bygge din SQL
statement dynamisk som en streng i din SP

Der mangler lidt arbejde endnu i den vedlagte SP
Du kan slå de forskellige funktioner i BOL

---------------------------------
CREATE PROCEDURE sp_GetMissingIDS (
@VALUE_LIST VarChar(100)
)
AS
SET NOCOUNT ON

DECLARE @SQL_CLAUSE NVarChar(500)

SET @SQL_CLAUSE = N'
DECLARE @ID Int
DECLARE @MISSING VarChar(100)

DECLARE ID_CURSOR CURSOR FOR
SELECT ID FROM tblTest WHERE ID IN ' + @VALUE_LIST + '

SET @MISSING = ''' + @VALUE_LIST + '''

OPEN ID_CURSOR
FETCH NEXT FROM ID_CURSOR INTO @ID
WHILE @@FETCH_STATUS = 0
BEGIN
SET @MISSING = REPLACE(@MISSING, @ID, '''')
FETCH NEXT FROM ID_CURSOR INTO @ID
END
CLOSE ID_CURSOR
DEALLOCATE ID_CURSOR
SELECT IS_MISSING = @MISSING'

EXEC sp_ExecuteSQL @SQL_CLAUSE

SET NOCOUNT OFF
---------------------------------

Fx kaldet "Exec sp_GetMissingIDS '(67,54,87,98,34,65)'"
Vil returnere
IS_MISSING
------------------------
(,,87,98,34,)


mvh/Peter Lykkegaard



Kristian Damm Jensen (13-02-2002)
Kommentar
Fra : Kristian Damm Jensen


Dato : 13-02-02 08:07

Jesper Stocholm wrote:
>
> Jeg har en række værdier, som jeg gerne vil undersøge for manglende
> forekomst i en række i en tabel
>
> Mine data kunne være
>
> 67,54,87,98,34,65
>
> Disse data genereres af en applikation - eller gives som input fra en
> bruger.
>
> Jeg har behov for checke, at alle disse tal er tilstede i en kolonne i en
> tabel.
>
> Jeg ville egentlig gerne lade min db ordne dette for mig, så den evt
> returnerede de værdier fra stregen, der _ikke_ modsvares af en værdi i
> tabellen.
>
> Jeg har prøvet at få det til at virke ... men jeg er ikke helt i mål
> endnu.
>
> Mit sidste forsøg på en SQL - der dog ikke virker - er :
>
> SELECT
> *
> FROM
> (67,54,87,98,34,65) as TempCheck
> WHERE id NOT IN
> (SELECT prnumber FROM table where number = 4)
>
> ... men hvad skal SQL være i stedet ?
>
> pft,

(1) lidt benarbejde, der lægger dine tal over i en temporær tabel:

TempTab
======
67
54
87
98
34
65

(2)
select * from temptab
where id NOT IN
(SELECT prnumber FROM table where number = 4)

--
Kristian Damm Jensen | Feed the hungry at www.thehungersite.com
kristian-damm.jensen@cgey.dk | Two wrongs doesn't make a right,
ICQ# 146728724 | but three lefts do.


Søg
Reklame
Statistik
Spørgsmål : 177517
Tips : 31968
Nyheder : 719565
Indlæg : 6408636
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste