06. februar 2007 - 04:20Der 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?
"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.
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... :-)
Synes godt om
Ny brugerNybegynder
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.