Avatar billede celal Nybegynder
26. februar 2002 - 11:19 Der er 25 kommentarer og
1 løsning

Sql sætning

Jeg har en tabel (Tabel1) og en forespørgsel(Tabel2) som jeg gerne vil lave en forespørgsel på. Men den er lidt tricky!
Jeg har lavet en INNER JOIN på de to tabeller, men jeg skal faktisk bruge det modsatte af det jeg får.

SELECT [Tabel1].*, [Tabel2].*
FROM [Tabel2] INNER JOIN [Tabel1] ON [Tabel2].[FeltA] =[Tabel1].[FeltB];

Jef får nogle poster, men jeg skal faktisk bruge dem som jeg ikke får vist. Hvordan laver jeg en sql sætning som viser det modsatte, dvs. alle de poster hvor feltA og FeltB ikke er ens.
Avatar billede terry Ekspert
26. februar 2002 - 11:23 #1
celal>If you can give an explanation to my comment to http://www.eksperten.dk/spm/177494 then perhaps I could help you here too!
Avatar billede proaccess Nybegynder
26. februar 2002 - 11:26 #2
Prøv med:

SELECT [Tabel1].*, [Tabel2].* FROM [Tabel1] LEFT JOIN [Tabel2] ON [Tabel2].[FeltA]=[Tabel1].[FeltB] WHERE [Tabel2].[FeltA] IS NULL UNION SELECT [Tabel1].*, [Tabel2].* FROM [Tabel2] LEFT JOIN [Tabel1] ON [Tabel2].[FeltA]=[Tabel1].[FeltB] WHERE [Tabel1].[FeltB] IS NULL;
Avatar billede celal Nybegynder
26. februar 2002 - 11:33 #3
Terry: Sorry, jeg har kigget forkert det var faktisk dig der skulle have pointene, men jeg var for hurtig, og kom til at give belling pointene, jeg kan godt forstå at du er sur, for hans svar var noget være lort. men jeg brugte <> som du havde foreslået, sorry, det var ikke meningen.
Avatar billede celal Nybegynder
26. februar 2002 - 11:35 #4
Hvad gøre LEFT JOIN?
Avatar billede celal Nybegynder
26. februar 2002 - 11:36 #5
Proaccess, har du to FROM i sætningen?
Avatar billede terry Ekspert
26. februar 2002 - 11:37 #6
No problem celal :o) It isnt the points that I was concerned about I just could believe that != worked and a couple of answers did actually use it!
Anyway, I think youi have an answer here too, proaccess tends to get it right :o)
Avatar billede proaccess Nybegynder
26. februar 2002 - 11:38 #7
[a] LEFT JOIN [b]
tager ALLE data fra [a] og dem fra [b] som er i [a]...

[a] INNER JOIN [b]
tager kun dem, som både er i [a] og [b]...
Avatar billede proaccess Nybegynder
26. februar 2002 - 11:39 #8
JA, der er 2 FROM... Fordi det er en sammenbygget SQL  (UNION) som først tager den ene SELECT..FROM og derefter den anden SELECT...FROM
Avatar billede celal Nybegynder
26. februar 2002 - 11:47 #9
Proaccess, Når jeg skriver dette kommer der en mddelelse op som siger "der er defineret for mange felter"
Avatar billede celal Nybegynder
26. februar 2002 - 11:49 #10
det er noget med at man i Access kun kan medtage 255 felter
Avatar billede celal Nybegynder
26. februar 2002 - 11:50 #11
Forstår det ikke helt, jeg har jo ikke over 255 felter med.
Avatar billede proaccess Nybegynder
26. februar 2002 - 11:54 #12
Det har du ret i, jeg var for hurtigt ude...

Du skal nævne de enkelte felter i stedet for at bruge *

Eks:
SELECT [Tabel1].[Navn], [Tabel1].[Adresse], [Tabel2].Bynavn]...

Dette skal gøres i BEGGE SELECT-dele
(Det de 2 SELECT dele gør, er at FØRST tager vi alle fra A, som ikke er med i B, og derefter alle fra B, som ikke er med i A)
Avatar billede nih Novice
26. februar 2002 - 11:56 #13
SELECT [Tabel1].*, [Tabel2].*
FROM [Tabel2] INNER JOIN [Tabel1] ON [Tabel2].[FeltA] <> [Tabel1].[FeltB];

Virker den her ???

Niels
Avatar billede celal Nybegynder
26. februar 2002 - 12:37 #14
Nih, det virker ikke
Avatar billede celal Nybegynder
26. februar 2002 - 12:58 #15
Proaccess, det virker ikke, jeg får alt for mange poster, jeg skaulle have 100 poster, men jeg får ca.40.000
Avatar billede terry Ekspert
26. februar 2002 - 13:06 #16
You may have 100 in tabel1 but if there are a number of records in tabel2 with same foreign key for each record in table1 then you will get more than 100 records!
Avatar billede proaccess Nybegynder
26. februar 2002 - 13:12 #17
Så skal du nok lige spørge dig selv om HVAD det egentlig er du beder databasen om...

Prøv at se følgende eksempel:

Tabel1: 123, 134, 154, 176
Tabel2: 154, 176, 300

Vil jo resultere i følgende records, hvis du beder om alle, som ikke er ens, på grund af krydset mellem værdierne:

123, 154
123, 176
123, 300
134, 154
134, 176
134, 300
154, 176
154, 300
176, 154
176, 300
Avatar billede nih Novice
26. februar 2002 - 21:22 #18
Proaccess -> Det er netop det resultat min SQL vil give - Er der nogen forskel på vores løsninger ???

Niels
Avatar billede nih Novice
26. februar 2002 - 22:13 #19
proaccess -> Det er ikke fordi jeg mener den ene SQL er bedre end den anden, har bare lidt svært ved at gennemskue dem (især din) - og du er jo SQL guruen herinde.

Niels
Avatar billede proaccess Nybegynder
27. februar 2002 - 07:39 #20
Niels ->  "Min" SQL returnerer også følgende records:

123, Null
134, Null
154, Null
176, Null
Null, 154
Null, 176
Null, 300

Deri ligger forskellen...

Det var også derfor jeg bad celal undersøge HVAD det var, han var ude efter... Og om han havde tænkt over hvordan de 2 tabeller vil "krydse" hinnanden...

Ellers takker jeg bare for komplimenten... ;-)
Avatar billede nih Novice
27. februar 2002 - 08:20 #21
Et forslag mere, der måske giver det resultat du ønsker:

SELECT Tabel1.felta as felt , " tabel1" AS tabel
FROM Tabel2 RIGHT JOIN Tabel1 ON Tabel2.feltb = Tabel1.felta
WHERE Tabel1.felta Not In (select tabel2.feltb from tabel2);
UNION
SELECT [Tabel2].[feltb] as felt, " tabel2" AS tabel
FROM Tabel2 LEFT JOIN Tabel1 ON [Tabel2].[feltb]=[Tabel1].[felta]
WHERE Tabel2.feltb Not In (select tabel1.felta from tabel1);

Niels
Avatar billede nih Novice
27. februar 2002 - 08:25 #22
felt    tabel
123    tabel1    (123 findes ikke i tabel2.feltb)
134    tabel1    (134 findes ikke i tabel2.feltb)
300    tabel2    (300 findes ikke i tabel1.felta)

Niels
Avatar billede proaccess Nybegynder
27. februar 2002 - 08:32 #23
...kan forkortes til:

SELECT Tabel1.felta As Felt, "tabel1" AS Tabel FROM Tabel1 WHERE Tabel1.felta NOT IN (SELECT feltb FROM Tabel2) UNION SELECT Tabel2.feltb As Felt, "tabel2" AS Tabel FROM Tabel2 WHERE Tabel2.feltb NOT IN (SELECT felta FROM Tabel1);

...eller:

SELECT Tabel1.felta As Felt, "tabel1" As Tabel FROM Tabel1 LEFT JOIN Tabel2 ON Tabel1.felta=Tabel2.feltb WHERE Tabel2.feltB=Null UNION SELECT Tabel2.feltb As Felt, "tabel2" As Tabel FROM Tabel2 LEFT JOIN Tabel1 ON Tabel2.feltb=Tabel1.felta WHERE Tabel1.fleta=Null;
Avatar billede nih Novice
27. februar 2002 - 08:35 #24
proAccess -> '=null' skal være 'IS NULL'  ;o)

Niels
Avatar billede proaccess Nybegynder
27. februar 2002 - 08:39 #25
YEP ;-)  Skulle bare lige se, om du testede det af...  - tror jeg nok...
Avatar billede proaccess Nybegynder
13. marts 2002 - 07:42 #26
Fik du svar nok, og kan vi få lukket spørgsmålet...?
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