02. februar 2007 - 10:19Der 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.
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.
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
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?
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.
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')
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
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'
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)
thanks, if I get a bit of time over the weekend I'll take a look at your other question.
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.