|
| 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.
| |
|
|