Avatar billede avalon116 Nybegynder
12. oktober 2005 - 11:10 Der er 27 kommentarer

foresp. i foresp.

Hvordan der sql-en ud hvis man skal skrive en forespørgsel med joins, der bygger på en anden forespørgsel?
Avatar billede mugs Novice
12. oktober 2005 - 12:22 #1
Lav din forespørgsel der bygger på den anden forespørgsel. Gå i Vis > SQL og du har din SQL-sætning. Denne kan du kopiere f.eks ind i en VBA, blot sørg for, at sætningen satår på een linie eller bind linierne sammen med _, fjern ; til sidst im SQL
Avatar billede avalon116 Nybegynder
12. oktober 2005 - 12:47 #2
Ja.
Men hvis der er to foresp. hvor den ene bygger på den anden, hvordan skal den første så indsættes?
Jeg er klar over, at den kan oprettet i designvisning og så kopieres ind i sql'en i den anden foresp. Men hvordan skriver man den ind?

Eksempel:

Første foresp.:
SELECT Tabel1.*, Val(nz([Felt1])) & [Felt2] AS Felt3
FROM Tabel1;

Anden foresp.: (DET ER DENNEHER JEG ER I TVIVL OM!!!)

SELECT "SELECT Tabel1.*, Val(nz([Felt1])) & [Felt2] AS Felt3
FROM Tabel1" * FROM "SELECT Tabel1.*, Val(nz([Felt1])) & [Felt2] AS Felt3
FROM Tabel1"
Avatar billede mugs Novice
12. oktober 2005 - 14:16 #3
Select ForespørgslensNavn.Feltnavn.ForespørgslensNavn.Feltnavn1
FROM ForespørgslensNavn
Avatar billede avalon116 Nybegynder
12. oktober 2005 - 14:54 #4
Jeg kan ikke henvise til forespørgslens navn, da jeg er nødt til at lave det hele i VB, fordi der skal henvises til et variabelt tabelnavn.
Avatar billede fdata Forsker
27. oktober 2005 - 17:24 #5
Hvorfor ikke oprette forespørgslen dynamisk - men med fast navn - og så bruge den i din Forespørgsel2. Altså noget i stil med:

Call OpretQuery("Forespørgsel1","SELECT Tabel1.*, Val(nz([Felt1])) & [Felt2] AS Felt3 FROM Tabel1;")

Sub OpretQuery(Qnavn As String, Qsql As String)
  Dim Qdf As QueryDef
  SletQuery (Qnavn)
  Set Qdf = CurrentDb.CreateQueryDef(Qnavn)
  With Qdf
    .SQL = Qsql
    .Close
  End With
  Set Qdf = Nothing
End Sub

Sub SletQuery(Qn As String)
  On Error Resume Next
  CurrentDb.QueryDefs.Delete Qn
  On Error GoTo 0
End Sub
Avatar billede terry Ekspert
27. oktober 2005 - 19:24 #6
I'm not quite sure I understand the question but I would say that fdata is on the right track although you could use

Dim sSQL as String

sSQL = "SELECT ...... FROM  " & ThisCouldBeAVariableContainingTheQueryName & " Some more SQL Goes Here ........ "

CurrentDb.QueryDefs("YourQueryNameGoesHere").SQL = sSQL
Avatar billede avalon116 Nybegynder
31. oktober 2005 - 09:15 #7
Hej begge.
Jeg forstår ikke jeres løsningsforslag, jeg er ikke så god til det her.
Men jeg tror i bund og grund, det handler om notation. Altså hvis jeg har en foresp., der bygger på en anden, ville det se sådan her ud:

SELECT [Felt1] AS Felt2
FROM Foresp1;

Men hvis jeg ikke refererer til forespørgslen (Foresp1), men i stedet vil indsætte den, vil det så se sådan ud? (lad os sige at foresp1 ser sådan her ud: SELECT tabel1.* FROM tabel1)

sql = "SELECT [Felt1] AS Felt2
FROM & "SELECT tabel1.* FROM tabel1;";"
Avatar billede terry Ekspert
31. oktober 2005 - 11:00 #8
I think we need to understand what you meen when you say forespørgsel (query).

A query is an SQL statment which has been saved in the query collection.

Do you want to refer to a query (saved SQL), or do you want to select from a sub select? 

Can you give a bit more information as to exactly why you need to do this.
Avatar billede avalon116 Nybegynder
31. oktober 2005 - 11:01 #9
Det er ikke en gemt forespørgsel, men en "forespørgsel" oprettet udelukkende i VB. Altså bare en sætning.
Avatar billede terry Ekspert
31. oktober 2005 - 11:21 #10
well actually what your trying to do is select from a derived table


SELECT T2.*
FROM [SELECT * FROM T1]. AS T2;
Avatar billede avalon116 Nybegynder
31. oktober 2005 - 12:36 #11
Skal der så bare sættes kantede parenteser rund omkring den 2. "forespørgsel", som du har vist?
Avatar billede terry Ekspert
31. oktober 2005 - 12:47 #12
yes
Avatar billede avalon116 Nybegynder
31. oktober 2005 - 12:57 #13
ok, det prøver jeg lige.

Og hvis der i den 2. "forespørgsel" indgår nogle &-tegn (f.eks. en dLookup), hvordan skal de så behandles?
Avatar billede terry Ekspert
31. oktober 2005 - 13:22 #14
I suggest that you get "den 2." query working first (as a normal query) just to make sure that the SQL is valid.

What do you mean "nogle &-tegn" ?
Avatar billede avalon116 Nybegynder
31. oktober 2005 - 13:26 #15
Hvis nu den 2. "forespørgsel" indeholder noget DLookup såsom:

DLookup("[Felt]", "Tabel", "[Alder]=" & [Alder] - 2)

Så er jeg igen i tvivl om notationen. Ville det være:

SELECT T2.*
FROM [SELECT DLookup("[Felt]", "Tabel", "[Alder]=" & [Alder] - 2) FROM Tabel]. AS T2;
Avatar billede terry Ekspert
31. oktober 2005 - 13:56 #16
have you tried this in a query?

SELECT DLookup("[Felt]", "Tabel", "[Alder]=" & [Alder] - 2) FROM Tabel
Avatar billede terry Ekspert
31. oktober 2005 - 14:03 #17
I'm off out now, wil look later
Avatar billede Slettet bruger
31. oktober 2005 - 15:18 #18
Du skal bruge noget SELECT, FROM, WHERE, (SELECT, FROM osv)
Eks.

SELECT Ark1.felt1
FROM Ark1
WHERE id IN
(SELECT Ark1.id
FROM Ark1
WHERE (((Ark1.id)=1)));

!~)
Avatar billede fdata Forsker
31. oktober 2005 - 22:59 #19
Gør nu livet let for dig selv  ;o)
Opret en forespørgsel i forespørgselsvinduet. Her kan du udvælge felter og inkludere dlookup'er osv. Når den forespørgsel er på plads, kan du vælge menupunktet Vis/SQL-visning. Så får du SQL udtrykket udleveret på et sølvfad. Det kan du så klippe ud og benytte i din VBA kode.
Avatar billede avalon116 Nybegynder
01. november 2005 - 13:43 #20
fdata> nej det kan jeg ikke. Hvis min foresp. bygger på en anden foresp. så står den anden forespørgsels navn der jo bare.
Mit spørgsmål er egentligt ret enkelt. Hvordan inkluderer jeg så den anden forespørgsel?

Og ja den er også oprettet og gemt, så jeg bare kan sætte sql-koden ind i den første, men JEG VED IKKE HVORDAN.
Der skal vel være nogle tegn rundt om den eller sådan noget ik?
Avatar billede fdata Forsker
01. november 2005 - 16:01 #21
Hvis vi nu forestiller os, at din første forespørgsel hedder Q1. Posterne herfra vil du gerne trække over i den næste forespørgsel, Q2.

Du siger, at Q2 allerede indeholder et link til Q1; men at opbygningen af Q1 skal ændres fra gang til gang.

Løsningen er som jeg beskrev allerede 27/10-2005 17:24:04:
  Du sletter den gamle Q1 og opretter en ny.
  Eks.: OpretQuery("Q1","SELECT Tabel1.* FROM Tabel1 WHERE X=1;")
  Eks.: OpretQuery("Q1","SELECT Tabel1.* FROM Tabel1 WHERE X=2;")

Herved vil Q2, som jo allerede refererer til Q1, se de nye poster.
  Eks.: SELECT Q1.* FROM Q1

Du skal altså ikke indsætte kode el.lign. i Q2, du skal bare fyre den af.
Hele fidusen er, at du ændrer grundlaget dynamisk (altså Q1).

Q1 ligger altså som en "rigtig" forespørgsel (men ændres dynamisk)
Q2 ligger kun i kode (og kalder Q1)

OK?
Avatar billede mugs Novice
01. november 2005 - 17:40 #22
Også sletningen af Q1 kan ske gennem kode:

DoCmd.DeleteObject acQuery, "Q1"
Avatar billede terry Ekspert
01. november 2005 - 18:24 #23
31/10-2005 13:56:34
Avatar billede fdata Forsker
01. november 2005 - 23:17 #24
mugs >> Se koden 27/10-2005 17:24:04
OpretQuery sletter forespørgslen iden den oprettes påny  ;o)
Avatar billede mugs Novice
02. november 2005 - 05:49 #25
fdata > Jeg er ikke gået i dybden og læst alle indlæg.
Avatar billede avalon116 Nybegynder
02. november 2005 - 12:52 #26
Ok det  er mig, der ikke har fattet, hvad jeres svar går ud på, jeg var fastlåst i en tanke om at det handler om den rette sql-notation i VB. Jeg afprøver det, så snart jeg kan (har lige travlt med andre ting i disse dage), og vender tilbage.
Avatar billede fdata Forsker
02. november 2005 - 20:03 #27
mugs >> No problem  ;o)

avalon116 >> Vi venter spændt
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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