[SQL] unieke resultset met order

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • LeonM
  • Registratie: Oktober 2001
  • Laatst online: 27-04 16:51
Wellicht niet de meest duidelijke titel, maar ik kan even niet verzinnen hoe ik het anders moet noemen.

Ik heb een database waarbij een bepaald gegeven (kolom) over verschillende tabellen is verspreid. (Ik weet het, dat is verre van een correct ontwerp, maar het is legacy spul). Deze wil ik samenvoegen in een enkele resultset.

Ik deed dat met een UNION, omdat de results van de individuele queries kunnen overlappen en ik alleen in unieke waardes geïnteresseerd ben.

code:
1
2
3
SELECT property FROM table1
UNION
SELECT property FROM table2


Dat gaat goed, maar het probleem is dat ik nu volgorde hieraan wil aanbrengen, de records van table1 moeten eerder in de resultset komen dan de records uit table2.

Ik dacht dat als volgt op te lossen:

code:
1
2
3
4
5
6
SELECT property FROM (
SELECT property, 1 AS order FROM table 1
UNION
SELECT property, 2 AS order FROM table 1
) AS rs
ORDER BY rs.oder


Echter, nu is de output niet meer uniek. (Logisch, want output van de losse queries is nu niet meer hetzelfde.).

Wat ik ook probeer, ik krijg het maar niet voor elkaar om gesorteerd unieke resultsets te krijgen. Waarschijnlijk is de oplossing simpel, maar ik kom er niet uit :/ joins zijn niet echt een opties ivm verschillende layout en selectie criteria van de tabellen en de bovenstaande query wrappen in een extra select distinct kan ook niet omdat de volgorde dan niet meer gegarandeerd is.

Iemand suggesties?

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Idee 1: NOT EXISTS gebruiken voor de tweede tabel (en evt UNION ALL om performance afhankelijk van DB).
Idee 2: GROUP BY gebruiken op alle velden die je wil in de buitenste query, sorteren op min(rs.order).

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Wrapper query om je eigen functie heen die bijv je rs.order concatenate zodat alles wat enkel uit tabel 1 komt 1 wordt, alles uit tabel 1 en 2 wordt 12 (alfabetisch gesorteerd komt het dan nog steeds onder 1, desnoods orderen op left 1 uit rs.order) en alles uit enkel tabel 2 wordt 2.

Ik voorspel dat het een draak van een query wordt maar zo even uit het hoofd zou het eindresultaat moeten kloppen.


@pedorus :
1 geeft toch geen volgorde informatie meer? Als ik het goed begrijp wil hij simpelweg alles wat uit tabel 1 kwam bovenaan hebben.
2 is volgens mij het beste antwoord, mijne is dan erg omslachtig

[ Voor 21% gewijzigd door Gomez12 op 07-11-2012 23:36 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Bij optie 1 (die slecht schaalt naar veel tabellen) is het idee dat sorteren TS al gelukt was, dus dat laat je zo. Je gooit dus gewoon de rijen weg uit tabel 2 die je niet wil hebben aan de hand van id's bijvoorbeeld. Afgezien van de slechte schaalbaarheid is er wel een voordeel: Als tabel 2 verouderde/niet overeenkomende informatie bevat die je juist niet wil laten zien, dan kun je die wellicht weggooien, terwijl je met de group by optie eerder problemen krijgt.

Maar waarschijnlijk is optie 2 inderdaad het beste. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • LeonM
  • Registratie: Oktober 2001
  • Laatst online: 27-04 16:51
Optie 2 bleek inderdaad de beste oplossing :)

code:
1
2
3
4
5
6
7
SELECT property FROM (
SELECT property, 1 AS order FROM table1
UNION
SELECT property, 2 AS order FROM table2
) AS rs
GROUP BY property
ORDER BY MIN(rs.ord);


Wat ik alleen niet begrijp is waarom de order by perse een aggregate moet zijn? Waarom mag ik daar niet gewoon rs.ord gebruiken? Kan iemand dat uitleggen?

Acties:
  • 0 Henk 'm!

  • Paul
  • Registratie: September 2000
  • Nu online
Omdat je dan niet weet welke rs.ord je moet hebben om alle identieke waardes van 'property' bij elkaar te vegen :)

"Hoe werkt dat GROUP BY nu eigenlijk?" in "Programming FAQ - SQL"

[ Voor 58% gewijzigd door Paul op 08-11-2012 12:45 ]

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Acties:
  • 0 Henk 'm!

  • LeonM
  • Registratie: Oktober 2001
  • Laatst online: 27-04 16:51
Ah ja natuurlijk, dat is best logisch.

Bedankt voor de uitleg! :)
Pagina: 1