Avatar billede dreyfusdk Nybegynder
06. februar 2007 - 04:20 Der er 2 kommentarer og
1 løsning

Kombination af 2 SQL statements

Hej

Jeg kører et site, hvor jeg har nogen kampagner på, som mine brugere kan bruge. Når de anvender en kampagne (fx. et nyhedsbrev de kan tilmelde sig e.lig) så skal de ikke præsenteres for kampagnen længere. Jeg har en løsning på dette, men den er ikke helt "stueren" syntes jeg, og må kunne laves mere elegant.

Min database er opbygget med to tabeller, som følger (forsimplet):

* Campaigns
    - campaignId
    - campaignName

* Leads
    - leadId
    - campaignId
    - userId

Tabellen "Campaigns" indeholder oversigten over kampagner. Tabellen "Leads" indeholder en oversigt ove der leads/kampagner, som brugeren har brugt.

For at vise en komplet oversigt over kampagner laver man normalt denne:

<code>
Select * from campaigns
</code>

... Men jeg skal netop ikke vise de kampagner, som brugeren allerede har brugt. Derfor gør jeg i øjeblikket sådan, med en totrins proces:

<code>
userid = 1 ' eksempel userid på en tilfældig bruger
strSql = "select campaignId from leads where userid="& userid &""
set rs = conn.execute(strSql)   
    do while not rs.eof
        usedCampaignSQL = usedCampaignSQL& "and campaignId <> '"& rs("campaignId") &"' "
    rs.movenext
    loop
rs.close
</code>

På den måde laver jeg en klump SQL der indeholder alle de campaignId's der ikke skal vises.. og når jeg så skal lave min oversigt over ikke anvendte kampagner, for den pågældende bruger, genbruger jeg min "usedCampaignSQL" variabel:

<code>
strSql = "select campaignName from campaigns where campaignId <> 0 "& usedCampaignSQL &""
</code>

I princippet fungerer det. Men jeg syntes ikke det er kønt, og jeg kan fx. ikke benytte det (mig bekendt) på dén måde i en Stored Procedure.

Mit spørgsmål er derfor - kan man koge måden jeg gør det på nu, ned i én SQL sætning?
Avatar billede kjulius Novice
06. februar 2007 - 08:21 #1
Hvad om du gjorde sådan her?:

"SELECT * FROM campaigns WHERE NOT EXISTS (SELECT * FROM leads WHERE userid = '" & userid & "' AND campaignid = campaigns.campaignid)"

Det burde filtrere de kampagner fra, hvor der findes et tilsvarende id i leads og hvor det samtidig er den rigtige bruger. Jeg har brugt en subselect. Man kan for den sags skyld også bruge et format som:

"SELECT * FROM campaigns WHERE campaignid NOT IN (SELECT campaignid FROM leads WHERE userid = '" & userid & "')"

I begge tilfælde gør man brug af en subselect til at udvælge rækker. Om du vil bruge det ene eller det andet format kommer an på ens personlige stil og preferencer, men også en hastighedstest. Udførselshastigheden kan evt. variere lidt eller meget afhængig af dit datagrundlag.
Avatar billede dreyfusdk Nybegynder
06. februar 2007 - 09:20 #2
Wow - fedt! Tak for hjælpen. Det er er jo straight forward og lige til :-)

Jeg har ca. en halv mill. records i min leads-tabel og måske et par hundrede i "campaigns". Er der en bestemt af metoderne der vil fungere bedst?

Er der i øvrigt en god måde, til at køre en hastighedstest på? (udover at sidde med stopuret fra men executer SQLen til den giver resultatet)
Avatar billede kjulius Novice
06. februar 2007 - 21:51 #3
Ja, det er såmend ikke så svært endda.. :-)

Jeg er ikke sikker, for jeg har ikke selv MS SQL installeret, men mon ikke den har nogen værktøjer til at analysere SQL forespørgsler. Men nogen gange kan man selvfølgelig straks se forskel på udførselshastigheden, med eller uden stopur... :-)
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