JPSMedlem sedan nov. 2001101 inlägg Hur skall jag göra för att koppla och läsa ut data mellan tabellerna?
Jag har en mycket stor tabell med 160 000 poster där jag behöver få ut en rad som matchar en tabell med unika nycklar.
Tabell 1 - 160 000 poster
101, Bosse, Bil, Mat,
101, Nisse, Bil, Sova,
101, Janne, Bil, Mat,
102, Sara, Cykel, Mat,
102, Lars, Tåg, Mat,
102, Olle, Bil, Mat,
o.s.v.
Tabell 2 - 24 000 poster
101
102
103
Önskat resultat - 24 000 poster
101 - 101, Bosse, Bil, Mat,
102 - 102, Sara, Cykel, Mat,
Vad är rätt SQL?
Peter SMedlem sedan dec. 20025 483 inlägg Så 101, 102, 103 i Tabell 2 är unika? Spelar det någon roll vilken av 101-raderna i Tabell 1 som 101 i Tabell 2 matchar mot?
JPSMedlem sedan nov. 2001101 inlägg Hej.
nej det spelar ingen roll.
Peter SMedlem sedan dec. 20025 483 inlägg Finns det någon kolumn i tabell 1 som gör en post med id = x unik bland övriga poster med samma id?
GaqziMedlem sedan aug. 2002224 inlägg Jag kanske inte hänger med riktigt men om du bara vill få ut en av varje unikt värde i tabell 2 så borde du väl kunna använda GROUP BY? Du kommer behöva använda någon aggregeringsfunktion. Lite osäker på vilken som kan vara lämplig, men kanske något att gå på!
ex.
SELECT nyckel,person,resvag,ovrigt FROM tabell1
join tabell2 on tabell1.nyckel = tabell2.nyckel
GROUP BY nyckel
aasahMedlem sedan mars 20034 471 inlägg
Gaqzi skrev:
Jag kanske inte hänger med riktigt men om du bara vill få ut en av varje unikt värde i tabell 2 så borde du väl kunna använda GROUP BY? Du kommer behöva använda någon aggregeringsfunktion.
Nej! Group by används för att partitionera data och ska aldrig användas bara för att få ut unika värden. Det blir en massa onödigt jobb för databasen.
Och aggregerande funktioner har man för att räkna: dvs ta ut max, min, summa... et c. Verkar inte vara tillämpligt här.
(Edit: Eller så hade jag missförstått problemet här... :r )
JPS
-
Vad är det som avgör vilket unika värde du vill ha ut? Tex i ditt exempel på 101, vad är det som gör att du vill ha ut info om Bosse men inte om Janne och Nisse? Att det står först? Eller kunde det lika gärna varit Nisses info som kom ut om bara inte Janne och Bosse också kom ut? :q
-
Finns alla id-värden från tabell2 med i tabell1? Eller kan det finnas något id i en av tabellerna som inte finns i den andra?
JPSMedlem sedan nov. 2001101 inlägg Tabellen som innehåller 160 000 poster har organistationsnummer som jag behöver matcha med tabell 2. Tabell 2 innehåller utsorterade (efter flera led) unika organistationsnummer och jag behöver en ny lista med valfi rad från tabell 1 där organisationsnummer är lika. Jag har provat att få ut unika poster från tabell 1 men lyckas inte - får ut 150 000.
- Vad är det som avgör vilket unika värde du vill ha ut? Tex i ditt exempel på 101, vad är det som gör att du vill ha ut info om Bosse men inte om Janne och Nisse? Att det står först? Eller kunde det lika gärna varit Nisses info som kom ut om bara inte Janne och Bosse också kom ut?
Svar: det spelar ingen roll vilken rad som matchas.
- Finns alla id-värden från tabell2 med i tabell1? Eller kan det finnas något id i en av tabellerna som inte finns i den andra?
Svar: tabell 2 har helt unika organisationsnummer som finns med i tabell1. Orgnummer som finns i tabell 2 kan förekomma mellan 1-10 ggr i tabell 1.
Peter SMedlem sedan dec. 20025 483 inlägg Finns det någon kolumn i tabell 1 som gör varje rad unik, t.ex. ett löpnummer?
JPSMedlem sedan nov. 2001101 inlägg En lösning om möjligt är att först försöka gruppera tabell 1 men jag vet inte hur jag skall göra då group by nästan får med alla poster. Vet inte om det går att köra group by på bara ett fält när alla fält behöver vara med i resultatet?
JPSMedlem sedan nov. 2001101 inlägg Svar till Peter S: Inte just nu men det kan jag lägga till.
Peter SMedlem sedan dec. 20025 483 inlägg Då antar vi att du lägger till ett fält id som är av autonummertyp:
select <columns>
from tabell1 t1
inner
join tabell2 t2
on t1.orgnr = t2.orgnr
where t1.id
= ( select min(id)
from tabell1
where orgnr = t1.orgnr )
JPSMedlem sedan nov. 2001101 inlägg Skall prova återkommer - tack så länge!
aasahMedlem sedan mars 20034 471 inlägg
JPS skrev:
Vet inte om det går att köra group by på bara ett fält när alla fält behöver vara med i resultatet?
Det kan du inte, inte rakt av.
JPSMedlem sedan nov. 2001101 inlägg SQL frågan stannar efter 240 rader
Peters sql-får min dator att jobba mer än tidigare och tyvärr så stannar frågan vid 240 poster. Jag tror att det är för mycket data att gå igenom (sql-en fungerar utmärkt annars) och jag behöver då hjälp med att få ner antalet poster i tabell 1 - 160 000 till enbart unika poster. Någon som har en aning hur man gör då group by inte fungerar.
Det måste finnas en lösning:-(
aasahMedlem sedan mars 20034 471 inlägg
JPS skrev:
- Finns alla id-värden från tabell2 med i tabell1? Eller kan det finnas något id i en av tabellerna som inte finns i den andra?
Svar: tabell 2 har helt unika organisationsnummer som finns med i tabell1. Orgnummer som finns i tabell 2 kan förekomma mellan 1-10 ggr i tabell 1.
Då behöver du aldrig blanda in tabell2, eftersom alla unika orgnummer finns i tabell1 (visserligen flera gånger, men det finns alltså inget nummer som INTE finns i tabell1).
Har du fått in ett unikt idvärde för alla 160000 rader i tabell1? Det måste du ha för att följande ska kunna funka. Men givet att du har det bör du kunna banta Peters förslag till:
select <columns>
from tabell1 t1
where t1.id
= ( select min(id)
from tabell1
where orgnr = t1.orgnr )
Alternativt:
CREATE VIEW Least AS
SELECT orgnr, min(id) as minid
FROM tabell1
GROUP BY orgnr;
select <columns>
from tabell1 T INNER JOIN Least L ON T.id = L.minid;
DROP VIEW Least;
Vilket av dessa två skrivsätt som är mest optimalt vet jag inte ... Det är också fullt möjligt att det finns bättre sätt att skriva...
emissionMedlem sedan dec. 19996 721 inlägg Man bör inte skapa vyer för att lösa frågeproblem. Det är kostsamt och kräver mer rättigheter än nödvändigt.
Samma tanke kan genomföras med en derived table.
select <columns>
from tabell1 T INNER JOIN
(
SELECT orgnr, min(id) as minid
FROM tabell1
GROUP BY orgnr
) L ON T.id = L.minid;
JPSMedlem sedan nov. 2001101 inlägg Får bara ut en post med alternativ 1 och alt.2 år jag inte o funka - sitter just nu med MS Access. (Har inte haft tid att ladda över all data till MY-SQL.)
JPSMedlem sedan nov. 2001101 inlägg Stort tack till alla!
emission:s SQL fungerar klockrent!