Avatar billede mccookie Seniormester
17. september 2012 - 06:19 Der 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
Avatar billede ae03 Novice
17. september 2012 - 09:09 #1
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?
Avatar billede mccookie Seniormester
17. september 2012 - 14:07 #2
Hej,

Jeg har lavet en ny forespørgelse:

SELECT    Users.PkUserNumber, UserGroups.GroupName, Cards.CardIdentity, Users.FirstName, Users.LastName

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 

Eksempel:
Lastname = 101010 CardIdentity = 123123123 Cards.FkUserNumber = 1
Lastname = 101010 CardIdentity = 213123123 Cards.FkUserNumber = 2

Håber det giver mening.....
17. september 2012 - 17:40 #3
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?
Avatar billede mccookie Seniormester
18. september 2012 - 05:14 #4
Christian_Belgien

I eksempel 2 vil jeg gerne finde brugere fra user, der er oprettet med mere end 1 cards.fkusernumber i tabellen cards.

Gav det bedre mening
18. september 2012 - 09:44 #5
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?

Altså som i nedenstående tabeller?

Users
PkUserNumber, LastName
1  101010
2  202020
3  303030

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.
Avatar billede mccookie Seniormester
18. september 2012 - 10:00 #6
Hmm... den er ikke sat til fremmede nøgle - Desværre er det heller noget jeg er herre over....

Prøver lige det sidste script!
18. september 2012 - 11:56 #7
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?
21. september 2012 - 06:59 #8
Som aftalt andet steds, svar fra mig.
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
Computerworld tilbyder specialiserede kurser i database-management

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