17. september 2012 - 06:19Der er
7 kommentarer og 1 løsning
Find dubletter i 2 tabeller
SELECT Users.PkUserNumber, Cards.CardIdentity, Users.FirstName, Users.LastName, Users.FkUserGroup FROM Cards INNER JOIN Users ON Cards.FkUserNumber = Users.PkUserNumber
1) Jeg ville gerne at ovenstående kun gav en post pr. user i usertabllen, her giver den 1 linje fra hver tabel.
2) Så ville jeg gerne at den kun udskrev din poster der enten er oprettet med dobbelt Users.LastName (Hvilket er en nummerisk værdi), og eller er oprettet med dobbelt Cards.CardIdentity
Kan du tydeliggøre din beskrivelse? Jeg forstår i hvert fald ikke ret meget.
1) Mener du, at du kun får en linie, eller får du, som jeg tror, at du mener, en linie for hver post i de to tabel? Hvis du får flere poster for hvert PkUserNumber, må der vel være flere forekomster af samme FkUserNumber. Hvis du kun skal have en med, er der så nogle kriterier for hvilket, eller skal der bare vælges et tilfældigt? I det sidste tilfælde kan du vel bruge SELECT DISTINCT.
2)Hvad mener du med dobbelt Users.LastName og Cards.CardIdentity? Er det flere forekomster af samme værdi, eller er det flere forskellige værdier for samme UserNumber?
FROM UserGroups INNER JOIN Users ON UserGroups.PkGroupNumber = Users.FkUserGroup INNER JOIN Cards ON Users.PkUserNumber = Cards.FkUserNumber
GROUP BY Users.PkUserNumber, UserGroups.GroupName, Cards.CardIdentity, Users.FirstName, Users.LastName
ORDER BY Users.LastName, UserGroups.GroupName
Hvilket giver følgende data:
173 Æblegrenen 263707305 navn 01030324116 174 Æblegrenen 263720690 navn 01030324210 175 Æblegrenen 263628728 navn 01030324322
Og det er helt ok.....
Jeg vil gerne have følgende udtræk:
1) En liste hvor alle de med et Cards.CardIdentity hvor der er mere end en identisk fremgår. Listen vises med Users.LastName, Cards.CardsIdentity
2) En liste hvor alle hvorpå alle brugere med mere end en Users.LastName, og hvor denne er repræsenteret med mere end et Users.PkUserNumber i Cards.FkUserNumber
Det er svært at fatte præcist hvad du er ude efter. For din nummer 1) gætter jeg på, at der er nogle cards.cardidentity numbers der er brugt for mere end en user, såsom hvis Hans Hansen har cardidentity 2345 og Jens Jensen også har cardidentity 2345. Det ville du kunne undersøge med den følgende forespørgsel:
SELECT user.lastname, cards.cardidentity FROM user JOIN card ON user.pkusernumber = cards.fkusernumber WHERE cards.cardidentity IN(SELECT cardidentity FROM cards WHERE SUM(*) >= 2 GROUP BY cardidentity)
I den inderste select laver du en liste over duplikat cardidentity numre, numre der er brugt til mere end en user. I den ydre select søger du efter users med cardidenity der er på listen over duplikater.
Din nummer 2 har jeg ikke forstået. Hvilke fejl vil du søge efter? Users der har mere end et cardidentity? Eller hvad?
mccookie, den smutter stadig. Hvis cards.fkusernumber er foreign key til usertabellen, så kan, for eksempel, user med pkusernumber 1 kun have Cards.FkUserNumber 1. Cards.FkUserNumber 2 ville referere til en anden user. Du siger i din forespørgsel ....INNER JOIN Cards ON Users.PkUserNumber = Cards.FkUserNumber.... Ikke sandt?
Cards CardIdentity, FkUserNumber 123123123 1 213123123 ? (hvis forskelligt fra 1 er det en anden user)
Men det kunne naturligvis forekomme, at i users tabellen, og derfor også i cards tabellen, er der users der er oprettet flere gange. Såsom:
PkUserNumber, LastName 1 101010 2 202020 3 101010
Hvis det er sådanne tilfælde du vil fange kan du gøre det med sådan en forespørgsel:
SELECT * FROM Users WHERE LastName IN (SELECT LastName FROM Users GROUP BY LastName HAVING COUNT(*) >1)
Igen, i den inderste select finder du de LastNames der forekommer mere end en gang, og i den yderste select finder du de linjer i tabellen der har et af disse LastNames.
Jeg er vist ikke så god til at udtrykke mig idag. Jeg prøver igen. Du vil finde ud af, om en bruger har flere forskellige fkusernumber's i cards tabellen, siger du. Hvordan ved du hvilke fkusernumre der hører til hvilke brugere? Når jeg ser på den forespørgsel du viser i #2, så ser jeg, at du joiner users tabellen og cards tabellen ved at users.pkusernumber = cards.fkusernumber. Altså en linje i cards tabellen hører til en bruger, hvis og kun hvis den linje's fkusernumber er det samme som brugerens pkusernumber.
Hvis en bruger, såsom brugeren med lastname = 101010, har flere forskellige cards.fkusernumber's, så må denne bruger også have flere forskellige user.pkusernumber's. Det kan ske, hvis nogen placerer brugeren i users tabellen idag og glemmer det er gjort og så placerer brugeren i users tabellen igen i morgen. Så det er mit gæt, at du i realiteten søger efter brugere, der forekommer flere gange i users tabellen. Sådanne brugere skulle du kunne finde med en forespørgsel som den jeg viser i #5. Har du prøvet den forespørgsel?
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.