16. november 2010 - 08:27Der 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
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
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".
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!
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 ?
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.
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.
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).
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.
Synes godt om
Ny brugerNybegynder
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.