Avatar billede milandt Nybegynder
21. august 2005 - 14:29 Der 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.
Avatar billede terry Ekspert
21. august 2005 - 18:36 #1
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
Avatar billede milandt Nybegynder
21. august 2005 - 21:34 #2
"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."

They both execute fine seperated.
Avatar billede terry Ekspert
21. august 2005 - 22:03 #3
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?
Avatar billede milandt Nybegynder
21. august 2005 - 22:20 #4
In the first one I have
M.Id, M.Name, C.Classname, RM.Timestamp, RM.PointsGained AS Gained, RM.PointsLost AS Spent

In the second one I have
M.Id, SUM(RM.PointsGained-RM.PointsLost) AS Points

M.Id = M.Id

If I cant union the 2 queries like this, what can I then do to "merge" them?
Avatar billede terry Ekspert
22. august 2005 - 09:18 #5
It depends on how the data is related!

What do you want to achieve by using a UNION if the data from each SQL is not the same?
Avatar billede kjulius Novice
22. august 2005 - 18:15 #6
milandt--> Et par spørgsmål:

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 :-)
Avatar billede kjulius Novice
22. august 2005 - 18:25 #7
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.
Avatar billede kjulius Novice
22. august 2005 - 18:42 #8
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;
Avatar billede milandt Nybegynder
24. august 2005 - 14:03 #9
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.

Læg et svar for points.

Dennis
Avatar billede kjulius Novice
24. august 2005 - 20:10 #10
Okay, intet problem... :-)
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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