Avatar billede dragnor Juniormester
02. februar 2007 - 10:19 Der er 23 kommentarer og
1 løsning

indviklet sql

hej eksperter

jeg har 3 SQL forespørgsler i access, og nu vil jeg gerne have følgende:

SELECT Kort.*
FROM Kort, Sel, Kan
WHERE (Kan.Kontraktnr <> Sel.Kontraktnr <> Kort.Kontraktnr) AND Kort.Dato LIKE '**-**-2007';

Problemet er at den går ind i en uendelig løkke.

Kort, Sel, Kan: er de 3 forespørgsler som hver i sær giver et ganske normalt resultat. Dog ikke med samme indhold, hverken i koloner eller antal poster.
Avatar billede kalp Novice
02. februar 2007 - 10:26 #1
kan man gøre sådan her overhovedet? kan være det bare er mig som ikke kender det
Kan.Kontraktnr <> Sel.Kontraktnr <> Kort.Kontraktnr

men ville da tro man gør noget lignende

Kan.Kontraktnr <> Sel.Kontraktnr AND Sel.Kontraktnr <> Kort.Kontraktnr

men synes stadig sql'en lyder sjov:) altså sammenligningen.

hvad er det du gerne vil hive ud? så er det lettere at lave en sql til dig:)
Avatar billede dragnor Juniormester
02. februar 2007 - 10:31 #2
puha den er svær at beskrive men jeg skal gøre et forsøg.
Avatar billede dragnor Juniormester
02. februar 2007 - 10:37 #3
jeg har 2 tabeller.

i den en tabel er der 2 produkttyper: Sel og tdk

De har hver et Kontraktnr og en Dato.

Jeg skal bruge alle de poster hvor produkttypen er lig med tdk.

Men kun de poster hvor der ikke også er en post med samme dato og kontraktnr og hvor produkttypen er lig med sel.

Samtidig skal det være et kriterie at der ikke er nogen poster i den anden tabel hvor dato og kontraktnr er lig med der hvor produkttypen er lig med tdk i den først tabel.

Gav det mening?
Avatar billede kalp Novice
02. februar 2007 - 10:42 #4
jeg har forstået det og kan sagtens lave den sql, men du må lige fortælle hvad kolonnenavne hedder i tabellerne:)
for du nævner at du har 2 tabeller, men i din egen sql kan jeg se 3.

og du snakker om at tjekke på produkttypen om den er lig med tdk, men en sammenligning du ikke selv har lavet i din sql.. så jeg kan ikke vide hvilken tabel denne kolonne findes i:)

lidt mere info om dette og sql'en er på vej.. det er ikke så svært
Avatar billede dragnor Juniormester
02. februar 2007 - 10:46 #5
grunden til at du akn se 3 er fordi det er 3 forskellige forespørgsler, men du får lige lidt mere info, 2 sek
Avatar billede dragnor Juniormester
02. februar 2007 - 10:49 #6
Tabel 1:

Dato
Kontraktnr
Type(under type finde både tdk og sel)

Tabel 2:
Dato
Kontraktnr
Type(her er der ca. 30 forskellige typer)


Resten af kolonerne har ikke den store betydning. nogen
Avatar billede dragnor Juniormester
02. februar 2007 - 10:51 #7
Kort:
SELECT *
FROM tblSalgHW
WHERE Type='TDK';

Sel:
SELECT *
FROM tblSalgHW
WHERE Type='SEL';

Kan:
SELECT *
FROM tblSalgPakker
Avatar billede dragnor Juniormester
02. februar 2007 - 10:51 #8
Så kan du se hvad hver af mine forespørgsler indeholdte, se ovenstående
Avatar billede kalp Novice
02. februar 2007 - 11:01 #9
Du skulle nok have skrevet navne frem for tabel1 og tabel2, men skidt med det:) du retter bare navnene i min sql.

SELECT  tabel1.*
FROM tabel1, tabel2
WHERE tabel1.kontraktnr NOT IN (SELECT tabel2.kontraktnr FROM tabel2 WHERE tabel2.kontraktnr = tabel1.kontraktnr AND tabel2.Type = 'SEL')

den er ikke komplet.. men er det noget lignende det du mener?
Avatar billede dragnor Juniormester
02. februar 2007 - 11:08 #10
ja udover at dem jeg kalder Kort, Sel og Kan er forespørgsler, som trækker oplysninger fra tabellerne tblSalgHW(den tabel hvor Kort og Sel findes) og tblSalgPakker.
Avatar billede kalp Novice
02. februar 2007 - 11:25 #11
okay nu er jeg med.. har ikke arbejdet med forespørgsmåler på den måde:)
beklager jeg ikke fik forstod spørgsmålet godt nok
Avatar billede dragnor Juniormester
02. februar 2007 - 11:27 #12
det er okay, jeg er bare glad for din hjælp, det er pænt af dig!
Avatar billede dragnor Juniormester
02. februar 2007 - 11:31 #13
Det ser ud til at du måske har fat i noget af det rigtige hvis man skriver det sådan her

SELECT  Kort.*
FROM Kort
WHERE Kort.kontraktnr NOT IN (SELECT tblSalgHW.kontraktnr FROM tblSalgHW WHERE tblSalgHW.kontraktnr = Kort.kontraktnr AND tblSalgHW.Type = 'SEL' tblSalgHW.Dato LIKE '**-**-2007') AAND Kort.kontraktnr NOT IN (SELECT tblSalgPakker.kontraktnr FROM tblSalgPakkerWHERE tblSalgPakker.kontraktnr = Kort.kontraktnr AND tblSalgPakker.Dato LIKE '**-**-2007')


var det sådan du havde tænkt det?
Avatar billede kalp Novice
02. februar 2007 - 12:26 #14
ja det nemlig:)
du har et a for meget i AAND
Avatar billede dragnor Juniormester
02. februar 2007 - 12:57 #15
nu er problemet bare at det tager den 10-15 min at komme med resultatet, selvom der kun er nogle få 1000 poster
Avatar billede terry Ekspert
02. februar 2007 - 17:10 #16
The reason why your query takes so long is very likley because of your sub select (NOT IN(SELECT...)

The sub select gets performed for every record in the outer select which obvioulsy takes time.
Another method is to change the sub select to a derived table (temp table) and make an outer join on this. Then test for kontraktnr being NULL, which is the same as NOT IN

Hope thats understandable
Avatar billede dragnor Juniormester
08. februar 2007 - 10:42 #17
Hi terry, can you give an example how to construct the SQL?
Avatar billede dragnor Juniormester
08. februar 2007 - 12:58 #18
Terry, can you change this?

SELECT Kort.*
FROM (SELECT * FROM tblSalgHW WHERE tblSalgHW.Type = 'TDK' AND tblSalgHW.Dato LIKE '**-**-2007') AS Kort
WHERE Kort.kontraktnr NOT IN (SELECT tblSalgHW.kontraktnr
FROM tblSalgHW
WHERE tblSalgHW.kontraktnr = Kort.kontraktnr AND tblSalgHW.Type = 'SEL' AND tblSalgHW.Dato LIKE '**-**-2007')
AND Kort.kontraktnr NOT IN (SELECT tblSalgPakker.kontraktnr
FROM tblSalgPakker
WHERE tblSalgPakker.kontraktnr = Kort.kontraktnr AND tblSalgPakker.Dato LIKE '**-**-2007') AND Kort.Dato LIKE '**-**-2007'
Avatar billede dragnor Juniormester
08. februar 2007 - 12:59 #19
just forget the last:  AND Kort.Dato LIKE '**-**-2007'
in the SQL
Avatar billede terry Ekspert
08. februar 2007 - 13:32 #20
I'll have a look later, busy right now
Avatar billede terry Ekspert
08. februar 2007 - 20:12 #21
I'll let you try to make use of these example yourself, if you have any problems then drop a comment.

This example uses two table T1 and T2, both have an ID column. It uses a derived table but actually doesnt need to. Just a normal LEFT JOIN would work also.

T1 has ID 1,2,3,4,5,6,7
T2 has ID 1,2,7



I want to find all those in T1 which do not exist in T2.

SELECT T1.*
FROM T1 LEFT JOIN [SELECT * FROM T2]. AS T2 ON T1.ID = T2.ID
WHERE (((T2.ID) Is Null));

This one with normal LEFT JOIN

SELECT T1.*
FROM T1 LEFT JOIN T2 ON T1.ID = T2.ID
WHERE (((T2.ID) Is Null));

and now using NOT IN
SELECT T1.*
FROM T1 WHERE T1.ID NOT IN (SELECT ID FROM T2)
Avatar billede dragnor Juniormester
13. marts 2007 - 09:25 #22
that was the right one, thank you terry
Avatar billede terry Ekspert
13. marts 2007 - 12:15 #23
Great, I'll place an answer then :o)
Avatar billede terry Ekspert
16. marts 2007 - 08:42 #24
thanks, if I get a bit of time over the weekend I'll take a look at your other question.
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