21. august 2005 - 14:29Der er
9 kommentarer og 1 løsning
UNION af to SQL sætninger
Hej.
Jeg har to sql sætninger jeg gerne vil have samlet. Nu kender i ikke datamodellen, men jeg håber at det kan lade sig gøre alligevel.
SQL 1: SELECT M.Id, M.Name, C.Classname, RM.Timestamp, RM.PointsGained AS Gained, RM.PointsLost AS Spent FROM RaidMembers AS RM, Raids AS R, Members AS M, Classes AS C WHERE R.Id = 22 and R.Id=RM.RaidId And RM.MemberId=M.Id And C.Id=M.Class ORDER BY M.Class, RM.PointsGained-RM.PointsLost DESC, M.Name;
SQL 2: SELECT M.Id, SUM(RM.PointsGained-RM.PointsLost) AS Points FROM RaidMembers AS RM, Raids AS R, Members AS M, Classes AS C, Locations AS L WHERE R.Id=22 And RM.MemberId=M.Id And C.Id=M.Class And L.Id=R.Location GROUP BY Name, L.Location, M.Id, ClassName, M.Class, L.Id ORDER BY M.Class, M.Name, L.Location;
De returnere det de skal hver for sig, og de skal samles så M.Id er fælles. R.Id er en parameter som også er den samme i begge sætninger. Synes ikke jeg kan få en UNION til at virke.
if you can get BOTH SQL queries to work then you should have no problem getting a UNION to work as long as the fields in each SQL are the same type
SELECT M.Id, M.Name, C.Classname, RM.Timestamp, RM.PointsGained AS Gained, RM.PointsLost AS Spent FROM RaidMembers AS RM, Raids AS R, Members AS M, Classes AS C WHERE R.Id = 22 and R.Id=RM.RaidId And RM.MemberId=M.Id And C.Id=M.Class ORDER BY M.Class, RM.PointsGained-RM.PointsLost DESC, M.Name UNION SELECT M.Id, SUM(RM.PointsGained-RM.PointsLost) AS Points FROM RaidMembers AS RM, Raids AS R, Members AS M, Classes AS C, Locations AS L WHERE R.Id=22 And RM.MemberId=M.Id And C.Id=M.Class And L.Id=R.Location GROUP BY Name, L.Location, M.Id, ClassName, M.Class, L.Id ORDER BY M.Class, M.Name, L.Location
"The ORDER BY expression (M.Class) includes fields that are not selected by the query. Only those fields requested in the first query can be included in ORDER BY expression."
If I dont use any ORDER BY at all:
"The number of columns in the two selected tables or queries of a union query do not match."
Only the last ORDER BY is used, so the first can be removed. Then make sure that you have the same number of columns (fields) and the data types in BOTH SQL are the same in each column! If you can send me your database then I can maybe see the problem?
1) Er du sikker på, at det er en UNION du ønsker? Det lyder mere som om du ønsker at knytte dem sammen med en JOIN. En UNION er den fælles delmængde af to datasæt, mens UNION ALL er fællesmængden af to datasæt, hvis du kan huske din mængdelære fra folkeskolen. Det kræver i sagens natur, at strukturen i de to sæt er nøjagtig ens. Det er de jo ikke. Du skriver desuden noget om, at de skal knyttes sammen på M.Id - igen noget som indikerer, at det du egentlig ønsker er en JOIN. Er jeg helt forkert på den?
2) Kan din SQL 2 køre i sin nuværende udformning? Du grupperer på mange flere felter end du medtager i din select. Order By er også på felter du ikke medtager. Ikke at jeg har tjekket om det vil kunne køre, men det synes jeg ser forkert ud. Eller har du "forkortet" den for at spare os for nogle indviklede forespørgsler. I så fald har det ikke virket efter hensigten :-)
Jeg kom vist til at skrive noget vrøvl omkring mængdelæren. UNION giver ikke den fælles delmængde (det er vistnok INTERSECT, som ikke understøttes af Access, der giver den funktion). UNION giver den unikke fællesmængde af to datasæt.
Nå, hvis jeg nu skal gøre et forsøg (med alle mulige forbehold pga. ovenstående spørgsmål):
SELECT M.Id, M.Name, C.Classname, RM.Timestamp, RM.PointsGained AS Gained, RM.PointsLost AS Spent, RMP.Points as RaidMemberPoints FROM RaidMembers AS RM, Raids AS R, Members AS M, Classes AS C, SQL2forespørgsel AS RMP WHERE R.Id = 22 and R.Id=RM.RaidId And RM.MemberId=M.Id And C.Id=M.Class And M.Id=RMP.Id ORDER BY M.Class, RM.PointsGained-RM.PointsLost DESC, M.Name;
kjulius, du har ret. det var ikke en union jeg havde brug for. det du skriver virker, og med lidt tilpasning/optimering opfylder det alle mine krav :) tak for hjælpen.
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.