deaktivert443556 Skrevet 15. mai 2015 Del Skrevet 15. mai 2015 Sett at tabellen 'pristabell' inneholder mange prislister hvor en gitt prisliste kan finnes i mange versjoner med forskjellig dato. Jeg ønsker å sammenligne prisene i den ene mot den andre, men jeg vil ha ut alle varene fra den første filen selv om de kanskje ikke finnes i den andre. Jeg prøver under her å få ut prisliste 'xx' for 2014 og 2015. Det finnes varer i den nyeste versjonen som ikke fantes i den gamle, men jeg får kun ut de varene som finnes i begge. Altså om jeg bruker LEFT JOIN, eller INNER JOIN, får jeg samme resultat. Select A.varenr, A.dato, A.pris, B.dato, B.pris FROM pristabell A LEFT JOIN pristabell B on A.prisliste = B.prisliste and A.varenr = B.varenr WHERE A.prisliste = 'xx' and A.dato = '20150101' and B.dato = '20140101' Hvis jeg derimot bruker LEFT JOIN for å hente data fra en helt annen fil, fungerer det fint. I eksempelet her tar jeg ut den alternative enheten til alle varene i prisliste 'xx'. Det er ikke alle varene som faktisk har en alternativ enhet, men jeg får likevel ut alle varene fra prislisten i denne spørringen. Select A.varenr, A.dato, A.pris, C.alternativenhet FROM pristabell A LEFT JOIN enheter C on A.varenr = C.varenr WHERE A.prisliste = 'xx' A.dato = '20150101' Noen tips? Lenke til kommentar
quantum Skrevet 15. mai 2015 Del Skrevet 15. mai 2015 outer join eller union. med left join får du alt du ber om i den ene og det som matcher i den andre prislista, ikke alt fra begge. når det blir det samme med inner join kommer det kun av at ingen varer er utgått fra 2014 til 15. Lenke til kommentar
deaktivert443556 Skrevet 15. mai 2015 Forfatter Del Skrevet 15. mai 2015 (endret) med left join får du alt du ber om i den ene og det som matcher i den andre prislista Ja, det er dette jeg prøver på. Prislisten for 2015 inneholder følgende varer: 111 222 333 444 Prislisten for 2014 inneholder: 111 222 555 I uttrekket mitt vil jeg ha følgende: 111 (pris for 2015 og 2014) 222 (pris for 2015 og 2014) 333 (kun pris for 2015) 444 (kun pris for 2015) Det jeg faktisk får, uansett om jeg bruker INNER JOIN, LEFT JOIN, LEFT OUTER JOIN, FULL JOIN, eller FULL OUTER JOIN er: 111 (pris for 2015 og 2014) 222 (pris for 2015 og 2014) Nå tror jeg kanskje problemet mitt ikke skyldes at det er samme fil som benyttes to ganger, men at den sekundære tabellen er 'pristabellen'. Jeg forsøkte å bruke hele vareregisteret som den primære tabellen, og pristabellen som den sekundære. Med LEFT (OUTER) JOIN hadde jeg forventet å få ut hele vareregisteret, med pris på de få varene hvor dette er aktuelt. I stedet fikk jeg altså kun de varene som faktisk finnes i den valgte prislisten. Bytter jeg ut 'pristabellen' med 'enhetstabellen' (hvor kun noen få varer finnes), da fungerer det akkurat som det skal. Jeg får ut hele vareregisteret uansett, og noen få av disse varene er altså merket med en 'alternativ enhet'. Jeg tror konklusjonen er at jeg egentlig gjør det riktig, men at det er noe med denne 'pristabellen' som krever at det gjøres på en mer spesiell måte. Edit: Jeg fant idiotfeilen min... Opprinnelig kode: Select A.varenr, A.dato, A.pris, B.dato, B.pris FROM pristabell A LEFT JOIN pristabell B on A.prisliste = B.prisliste and A.varenr = B.varenr WHERE A.prisliste = 'xx' and A.dato = '20150101' and B.dato = '20140101' Fungerende kode: Select A.varenr, A.dato, A.pris, B.dato, B.pris FROM pristabell A LEFT JOIN pristabell B on A.prisliste = B.prisliste and A.varenr = B.varenr and B.dato = '20140101' WHERE A.prisliste = 'xx' and A.dato = '20150101' Endret 15. mai 2015 av Bradbury Lenke til kommentar
quantum Skrevet 15. mai 2015 Del Skrevet 15. mai 2015 med left join får du alt du ber om i den ene og det som matcher i den andre prislista Ja, det er dette jeg prøver på. I det første innlegget ditt fikk jeg inntrykk av at du ville ha full prisliste fra både 2014 og 2015, uavhengig om varen bare er i den ene - eller andre - lista. Lenke til kommentar
deaktivert443556 Skrevet 15. mai 2015 Forfatter Del Skrevet 15. mai 2015 Ja, jeg ser godt at det kan misforstås. Jeg nevnte at det finnes varer i den nye listen som ikke fantes i den gamle (nye varer), men jeg glemte å nevne at jeg ikke bryr meg om de varene som bare finnes i den gamle listen (utgåtte varer). Jeg fikk det uansett til å fungere! Lenke til kommentar
tHz Skrevet 15. mai 2015 Del Skrevet 15. mai 2015 Flytt B.Dato = '20140101' opp til left join ON Lenke til kommentar
deaktivert443556 Skrevet 15. mai 2015 Forfatter Del Skrevet 15. mai 2015 Takk, det var det jeg fant ut. Jeg prøvde å fremheve linjen med rød farge, men formateringen blir selvfølgelig ignorert siden jeg brukte [ code ]. Lenke til kommentar
tHz Skrevet 15. mai 2015 Del Skrevet 15. mai 2015 Takk, det var det jeg fant ut. Jeg prøvde å fremheve linjen med rød farge, men formateringen blir selvfølgelig ignorert siden jeg brukte [ code ]. Så det rett etter at jeg hadde postet Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå