Avatar billede eerikk Nybegynder
10. december 2003 - 10:56 Der er 11 kommentarer og
1 løsning

Join på to tabeller med sammentrækning

Hejsa - jeg har en abel-1 med www-adresser på formatet: http:\\www.xxx.dk og en tabel-2 med en masse www-adresser.

Jeg ønsker at slette alle de adresser fra tabel 2 der har NOGET med domænet (altså det jeg har skrevet som xxx) at gøre - hvordan gør jeg det? Jeg lavede følgende JOIN:

SELECT    *
FROM        [domain] INNER JOIN
                      uris ON [domain].[domain] = uris.Col001

men den vil også have "http:\\"-delen til at passe, og jeg kan ikke se hvordan jeg sletter herfra! Håber nogen kan hjælpe med dette tricky problem :o]

-Erik
Avatar billede arne_v Ekspert
10. december 2003 - 11:14 #1
Hvad med noget a la:

DELETE FROM tabel2 WHERE EXISTS (SELECT * FROM tabel1 WHERE CHARINDEX(tabel2.fuldurl,tabel1.url) > 0)
Avatar billede trer Nybegynder
10. december 2003 - 11:16 #2
brug en join med substring

select * from domain inner join uris on (substr(domain,6,99)=uris.col001) or (domain=col001)

udbyg med flere kriterier efter behov :-)
Avatar billede eerikk Nybegynder
10. december 2003 - 12:49 #3
Jeg prøvede at lave følgende:

SELECT    *
FROM        [domain]
WHERE    EXISTS
                          (SELECT    *
                            FROM          uris
                            WHERE      CHARINDEX([domain].[domain], uris.Col001) > 0)

Det gav kun det samme som jeg allerede havde.

Jeg prøvede også:

SELECT *
FROM  [domain] INNER JOIN
      uris ON substr([domain].[domain], 6, 99) = uris.Col001
OR    [domain].[domain] = uris.Col001

Der kunne metoden substr ikke genkendes (Jeg bruger SQL Server Enterprise Manager).
Avatar billede eerikk Nybegynder
10. december 2003 - 12:59 #4
Det jeg vil er at hvis jeg har adresser på formatet "http:\\www.xxx.dk" i en tabel, så vil jeg have fat på (enten slette eller select'e) de adresser i en anden tabel der bare indeholder "xxx.dk" et eller andet sted.
Avatar billede trer Nybegynder
10. december 2003 - 13:09 #5
Beklager - SUBSTR er Oracle - SQL Server kalder den for SUBSTRING..
Avatar billede eerikk Nybegynder
10. december 2003 - 13:19 #6
OK - det virker, men jeg får ikke det jeg gerne vil have (se ovenstående) - undskyld hvis jeg er besværlig :o]
Avatar billede trer Nybegynder
10. december 2003 - 13:30 #7
Du bliver nød til at "parse" dine felter - dvs. fjerne den del af teksten du ikke har behov for.  Måske en funktion a la

create function url(@s varchar(99))
returns varchar(99)
as
begin
    set @s = substring(@s,charindex('.',@s),99)
    set @s = substring(@s,1,charindex('/',@s))
return @s
end
go

den er blot lige skrevet og ikke testet, check lige syntax vedr. charindex - men burde skære alt af indtil første . i strengen (dvs. http://www.) og alt efter første / (dvs. /mypage.htm)

Vil nok give problemer hvis der ikke er en side nævnt i url'en - men du har nu et framework.
Avatar billede trer Nybegynder
10. december 2003 - 13:32 #8
du bruger den i join kriteriet således

.. on dbo.url(col1) = dbo.url(col2)
Avatar billede arne_v Ekspert
10. december 2003 - 13:35 #9
Umiddelbart ville jeg finde det fristende at flytte logikken fra SQL
til applikationen (Java, C#, VB, PHP, whatever):
  - lave en query i den første tabel
  - læse result set en record af gange
  - parse værdi og fyre en normal DELETE  med WHERE LIKE af sted

Applikationer er normalt bedre end database til streng manipulation.
Avatar billede trer Nybegynder
10. december 2003 - 13:39 #10
Performanceforskellen i ovenstående funktion og til en applikation er ikke særligt stor - men du har generelt ret.

Til gengæld "betales prisen" ved det overhead der er i at pumpe data ud af databasen og over i applikationen - det giver som regel lavere performance end at lade db'en håndtere det.

Du kan heller ikke gøre det inden for en (kort) transaktion - hvilket er problematisk i MsSQL hvis en anden bruger/applikation samtidig pumper data ind.
Avatar billede arne_v Ekspert
10. december 2003 - 13:48 #11
Det vil normalt give bedre performance at lade databasen gøre det. Men det her
lyder ikke som en 10000 gange om dagen operation.

Og det er nemmere at teste for alle mulige fejl situartioner i et
programmerings sprog som er beregnet til det.
Avatar billede eerikk Nybegynder
10. december 2003 - 14:32 #12
endeligt svar var:


DELETE
FROM [dbo].[domain]
WHERE site_id
IN ( SELECT    [domain].[site_id]
    FROM        [domain] CROSS JOIN
                      uris
    WHERE    (uris.Col001 LIKE '%' + SUBSTRING([domain].[domain], 10, 99) + '%') AND ([domain].[domain] LIKE 'http://www%')
  )
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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