Avatar billede cliffha Nybegynder
16. november 2010 - 08:27 Der er 17 kommentarer og
1 løsning

Inner Join

Hej

Jeg har initialer på 2 personer i en tabel, men jeg vil gerne have deres navne ud, og de ligger i en anden tabel. Er det muligt at gøre? Jeg har prøvet at sætte det op på denne måde, men den returnere 4 rows, hvor navnet er forskellig i hver row.

Den stored procedure jeg har prøvet at lave ser sådan ud:
SELECT afgivelser.OprettelsesDato, brugere.navn, brugere.navn, afgivelser.fejldato
FROM afgivelser
INNER JOIN brugere
on brugere.initialer = afgivelser.VagtassistentInitialer
or brugere.initialer = afgivelser.TeamlederInitialer
Avatar billede Syska Mester
16. november 2010 - 08:38 #1
Kan du komme med en lille oversigt over hvordan din table ser ud ?

Men ellers skal du måske ændre din JOIN ...

du bruger "OR" ... dvs hvis det ene eller andet passer, så laver den en join over på den anden table.
Avatar billede cliffha Nybegynder
16. november 2010 - 09:13 #2
Tak for svaret.

Jeg troede heller ikke at jeg skulle bruge or, men det virkede ikke med and.
Jeg har lavede et billede af opbygningen, som du kan se nedenunder:

http://dl.dropbox.com/u/10486172/databasebillede.jpg
Avatar billede teepee Nybegynder
16. november 2010 - 09:14 #3
Lav en union (altså én betingelse ad gangen)
SELECT afgivelser.OprettelsesDato, brugere.navn, brugere.navn, afgivelser.fejldato
FROM afgivelser
INNER JOIN brugere
on brugere.initialer = afgivelser.VagtassistentInitialer
union (evt. union all)
SELECT afgivelser.OprettelsesDato, brugere.navn, brugere.navn, afgivelser.fejldato
FROM afgivelser
INNER JOIN brugere
on brugere.initialer = afgivelser.TeamlederInitialer
Avatar billede Syska Mester
16. november 2010 - 09:33 #4
Som teepee siger ... men du burde stadig kunne lave en DISTINCT på din overstående query, for at få det til at virke, da dine rows er ens ... omend du joiner på 2 forskellige rows i "Afvigelser".

mvh
Avatar billede teepee Nybegynder
16. november 2010 - 09:41 #5
union er distinct, ellers skal man bruge union all
Avatar billede teepee Nybegynder
16. november 2010 - 09:45 #6
Så lige lidt teori. Initialer er en databærende nøgle, dvs. at du f.eks. kan genkende personen ud fra intialerne. Sådanne værdier skal man helst ikke bruge til primærnøgler. Du har lavet en fin id på tabellen, hvorfor benytter du ikke den i dine primær/fremmednøgle?
det er den klassiske postnummer situation. Hvad sker der når en person skifter efternavn, kan vedkommende så få nye initialer? Hvad sker der så med referencen til gamle afvigelser? den er væk!
Avatar billede Syska Mester
16. november 2010 - 10:50 #7
Ja, men du laver 2 select ved din union ... så burde det andet ikke være bedre ... eller er optimizeren smart nok til at ende ud med samme query i sidste ende for at finde dataen frem ?

mvh
Avatar billede teepee Nybegynder
16. november 2010 - 11:04 #8
Nu orker jeg ikke at lave et setup, men jeg går stærkt ud fra at optimizeren benytter primary key indexet på ID fra afgivelser til at finde en distinct liste hvis union benyttes, og at den er ligeglad hvis union all benyttes. Kun cliffha ved om der er sammenfald i initialerne. Union all er oftest meeeeget hurtigere end union og bør benyttes hvis der ikke er sammenfald i initialerne.
Avatar billede Syska Mester
16. november 2010 - 11:24 #9
Ja, deraf også min kommentar om det nok alligevel ender ud med den sammme execution plan.

mvh
Avatar billede cliffha Nybegynder
16. november 2010 - 11:31 #10
Som det er lige nu er det ikke meningen at det skal være muligt at skifte initialerne, og der er heller ikke mulighed for at nogle bruger kan få de samme initialer.
Avatar billede cliffha Nybegynder
16. november 2010 - 11:51 #11
Den opsætning som teepee lavede returnere bare det samme som den opsætning jeg selv havde lavet til at starte med.

Skal jeg i select have bruger.navn til at stå 2 gange? for den printer bare det samme navn 2 gange.

Og det er lige meget om jeg bruger union eller union all.
Avatar billede teepee Nybegynder
16. november 2010 - 12:31 #12
Jeg havde slet ikke set at der stod brugere.navn to gange.
Er de fordi du vil have vagtassistenten og teamleader stående på samme række?
Avatar billede cliffha Nybegynder
16. november 2010 - 12:37 #13
Ja, som det er nu bliver kun deres initialer hentet ud, men jeg ville gerne have deres navn ud i stedet.
Avatar billede teepee Nybegynder
16. november 2010 - 13:23 #14
Ok, så er vi tilbage til din egen sql fra første indlæg:

SELECT afgivelser.OprettelsesDato, b1.navn, b2.navn, afgivelser.fejldato
FROM afgivelser
INNER JOIN brugere b1 on b1.initialer = afgivelser.VagtassistentInitialer
INNER JOIN brugere b2 on b2.initialer = afgivelser.TeamlederInitialer

Syntaxen er nok helt 100% rigtig da jeg ikke lige har en sql server i nærheden, mangler muligvis et komma
Avatar billede cliffha Nybegynder
16. november 2010 - 13:27 #15
Mange tak, så virker det.
Avatar billede cliffha Nybegynder
16. november 2010 - 13:39 #16
Hvad skal jeg gøre hvis jeg også skal have en where på sql sætningen?

Sådan så where virker på afgivelser tabellen:

SELECT afgivelser.OprettelsesDato, b1.navn, b2.navn, afgivelser.fejldato
FROM afgivelser where id=@id
INNER JOIN brugere b1 on b1.initialer = afgivelser.VagtassistentInitialer
INNER JOIN brugere b2 on b2.initialer = afgivelser.TeamlederInitialer
Avatar billede teepee Nybegynder
16. november 2010 - 13:52 #17
på afgivelser skal du bare flytte den nedenunder de to joins. Hvis den skal betinge noget på brugere må du lave et view og selecte fra viewet med din where clause (eller gøre det dynamisk i din join).
Avatar billede cliffha Nybegynder
16. november 2010 - 14:51 #18
Ok, det var bare fordi jeg ikke skal afgivelse.id da jeg lavede where.

Hvad skal der til når jeg kalder funktionen i c#, for hvis jeg prøver på at hente navnet ud på de forskellige celler, så står de begge til at skulle hede navn.
Jeg kan selvfølgelig bare skrive hvad index den har.
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