Avatar billede cjep Nybegynder
04. marts 2009 - 20:27 Der er 5 kommentarer og
1 løsning

Fjern række i Dataset, hvis kol. A findes i Kol. B

Jeg har lavet en SQL, der er ret kompleks - så kompleks at jeg lever med at den giver mig nogle uønskede rækker med i svaret. Disse skal nu fjernes fra datasettet efter nedenstående simpel regel:

De uønskede rækker kan identificeres således:

t_id    p_id  subject
----    ----  -----------------------
35      34    1. indlæg i forum
36      35    SV:1. indlæg i forum
19      2    NYT emne
33      19    SV:NYT emne
3      2    Objektiver

Regel: Hvis t_id findes mindst en gang i p_id kolonnen, skal rækken t_id slettes.

Jeg har gang i noget vb.net kode, men er gået kold i arrays'ene:

For Each dr As DataRow In ds.Tables(0).Select()
For Each dr2 as DataRow In ds.Tables(0).Select()
  if dr2("parent_id") = dr("topic_id") then
  dr.Delete()
  End If
Next
Next

Det fejler naturligvis, fordi den reelt checker på samme række; men er der nogen der kan vise mig hvordan sådan et array-check skal se ud for at virke?

Takker mange gange...
Avatar billede arne_v Ekspert
05. marts 2009 - 03:35 #1
Bruger du SQL server ?

Hvis ja, så lav et view med den SQL som giver de data du har nu og så lav en SQL:

SELECT * FROM ditview WHERE t_id NOT IN (SELECT p_id FROM ditview)

SQL er faktisk godt til den slags.
Avatar billede arne_v Ekspert
05. marts 2009 - 03:37 #2
Hvis du vil lave det i app har jeg ikke meget fidus til DataSet.

En List<X> ville give mere fleksibilitet.

Og det burde være nemt at lave den operation du ønsker.
Avatar billede cjep Nybegynder
05. marts 2009 - 09:19 #3
Damn, havde slet ikke tænkt på Views; det blev heller ikke foreslået da jeg havde spørgsmålet i SQL gruppen :-)

Vender lige tilbage, når jeg har set på det!

/Claus
Avatar billede cjep Nybegynder
05. marts 2009 - 22:28 #4
Sørme, det lykkedes - men det var kringlet.. MS SQL kan ikke lave en 'CREATE OR REPLACE VIEW', men kræver et check først. Så det blev til 3 kald:

1. Slet gl. view, hvis det findes
"IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'My_view') DROP VIEW My_view"

2. Oprettelse af View drillede også, da jeg fik en syntax error. Det fandt jeg så frem til kunne omgås, ved brug af EXEC( ..
"EXEC(' CREATE VIEW CLJ_FORUMLIST AS SELECT ... ')"

3. Endelig skulle jeg jo så trække data ud, som beskrevet af arne_v:
"SELECT * FROM My_view WHERE t_id NOT IN (SELECT p_id FROM My_view)"

Så lykkedes det også!

Arne_v du fortjener ihvertfald nogle af pointene, så læg lige et svar.

/Claus
Avatar billede arne_v Ekspert
05. marts 2009 - 23:20 #5
OK
Avatar billede cjep Nybegynder
10. juli 2013 - 13:18 #6
Svar jf ovenfor
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester