Avatar billede dragnor Juniormester
22. februar 2008 - 12:54 Der er 13 kommentarer og
1 løsning

Hjælp til irriterende SQL

Hej Eksperter

Jeg håber nogen kan hjælpe mig med følgende problem hvis jeg har følgende tabel.

Tabel_1

Type  |  dato      | id
------------------------
4    | 01-01-2008 | 1
4    | 02-01-2008 | 2
4    | 03-01-2008 | 3
4    | 04-01-2008 | 4
4    | 05-01-2008 | 5
7    | 01-01-2008 | 1
7    | 02-01-2008 | 2
7    | 03-01-2008 | 3

Jeg skal bruge alle de id'er( i dette eksempel 4 og 5) som har type 4 men ikke type 7, hvordan gør jeg det? fx har id 1 både en type 4 og en type 7 derfor kan den ikke bruges, ligesom den skal finde id'erne ud fra et dato interval, men dato intervallet kan jeg godt selv finde ud af. Håber spørgsmålet er til at forstå.
Avatar billede jensen363 Forsker
22. februar 2008 - 13:05 #1
Du kan lave den ved hjælp af 3 forespørgsler :

QueryA 
SELECT Table_1.Type, Table_1.dato, Table_1.id
FROM Table_1
WHERE (((Table_1.Type)=4 And (Table_1.Type)<>7));

QueryB
SELECT Table_1.Type, Table_1.dato, Table_1.id
FROM Table_1
WHERE (((Table_1.Type)=7 And (Table_1.Type)<>4));

QueryC
SELECT QueryA.Type, QueryA.dato, QueryA.id
FROM QueryA LEFT JOIN QueryB ON QueryA.id = QueryB.id
WHERE (((QueryB.id) Is Null));
Avatar billede Slettet bruger
22. februar 2008 - 13:49 #2
Under kriterie for type skriver du 4 AND <>7
Avatar billede michael_stim Ekspert
22. februar 2008 - 13:53 #3
SELECT id FROM tabel WHERE (type <> 4 AND type <> 7) AND dato BETWEEN ... AND ...;
Avatar billede kalp Novice
22. februar 2008 - 15:42 #4
select id from Tabel_1 where id not in (select id from Tabel_1 where Type = 7)
and Type = 4

hvis det er dét du mener.
Avatar billede kalp Novice
22. februar 2008 - 15:43 #5
ps. du skal muligvis prefikse tabellen med et navn så Access kan se forskel på dem, men ideen er der i hvertfald:)
Avatar billede kalp Novice
22. februar 2008 - 15:46 #6
hvis der ikke understøttes "not in" så skal den laves sådan her istedet

select id from Tabel_1 where id in (select id from Tabel_1 where Type = 4)
and Type <> 7
Avatar billede terry Ekspert
22. februar 2008 - 17:56 #7
another idea
SELECT T.*
SELECT T.*
FROM Tabel_1 AS T LEFT JOIN (SELECT ID
FROM Tabel_1
WHERE Type=7)  AS X ON T.ID = X.ID
WHERE X.ID Is Null
Avatar billede terry Ekspert
22. februar 2008 - 17:56 #8
Oops
SELECT T.*
FROM Tabel_1 AS T LEFT JOIN (SELECT ID
FROM Tabel_1
WHERE Type=7)  AS X ON T.ID = X.ID
WHERE X.ID Is Null;
Avatar billede terry Ekspert
22. februar 2008 - 17:59 #9
I prefer using this method because Access seems to perform the sube select for every row in the outer SQL whcih can be very slow if there are many records.
Avatar billede terry Ekspert
22. februar 2008 - 18:01 #10
slow when using IN (SELECT ....)
Avatar billede dragnor Juniormester
23. februar 2008 - 08:52 #11
Tak alle sammen, der er flere gode forslag, og jeg afprøver dem mandag morgen da hastighed også har meget at skulle sige pga tabellen er meget stor. (ca. 500.000 poster.)
Avatar billede dragnor Juniormester
25. februar 2008 - 09:48 #12
Hej Alle jer som har skrevet, jeg har nu taget jensen363 forslag, som bør virke men accesse giver mig følgende fejl: The Column prefix "MS2" does not match with a table name or alias name used in the query. (#107)

Hvorfor? Det er kun når jeg bruger en left join den kommer med fejlen, ikke hvis jeg bruger inner join, men den kan jeg ikke rigtig bruge til noget.
Avatar billede dragnor Juniormester
25. februar 2008 - 12:32 #13
Ligepludselig virkede det, tror der var problemer med netværket, så den drillede. Tak for hjælpen jensen363 og alle i andre
Avatar billede jensen363 Forsker
25. februar 2008 - 13:07 #14
Takker for point
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