[SQL] Veld weergeven adhv Count uitkomst

Pagina: 1
Acties:

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Ik heb de volgende query
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
    SELECT DISTINCT VAL1
    FROM(
        SELECT DISTINCT VAL1, L.FLAG
        FROM TABLE, LOOKUP L
        WHERE VAL2 = 'Value' 
        AND VAL3 IN ('X', 'Y', 'Z') 
        AND trim(VAL4) = trim(L.KEY1) 
        AND L.KEY2 = 'A'  
        AND L.KEY3 = 'B'
        GROUP BY VAL1, L.FLAG
    )
    GROUP BY VAL1
    HAVING COUNT(FLAG)=1


In TABLE staan een x aantal records. Voor elke waarde van VAL1 kunnen er meerdere records zijn. Het gaat erom om te kijken of al deze records voldoen aan een bepaalde voorwaarde (FLAG='Y'). Alleen als dat het geval is dan mag VAL1 worden teruggegeven. Wat ik nu doe is kijken of er voor elke waarde van VAL1 de unieke FLAG waarden tellen. Als deze optelling nl. niet gelijk aan 1 is dan hebben niet alle records dezelfde FLAG waarde.

Op zich werkt dit goed maar er is 1 probleem. Als voor alle onderliggende records van VAL1 de FLAG waarde 'N' is dan is de opgetelde waarde ook gelijk aan 1 (er is immers maar 1 verschillende FLAG waarde). Dus wordt de VAL1 waarde opgenomen in de recordset. Dit wil ik dus zien te voorkomen. Maar wel op een zo efficiente manier. TABLE is nl. een behoorlijk grote tabel en hoe minder is daar doorheen moet hoe beter het is.

Wat ik zelf probeer te bereiken is dat dat als de optelwaarde van de verschillende FLAG waarden gelijk is aan 1 dat in dat geval deze unieke FLAG waarde ook wordt teruggegeven. Ik weet alleen niet hoe ik dit moet doen zonder weer door heel de tabel heen te moeten. Is zoiets mogelijk? Zo ja, hoe dan? Zo niet, is er een alternatief?

[ Voor 8% gewijzigd door Deddiekoel op 01-10-2004 17:45 ]

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Ik heb ook nog een alternatieve aanpak maar ook daar kom ik niet verder mee.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT DISTINCT VAL1, L1.FLAG AS FLAG1,  L2.FLAG AS FLAG2
FROM TABLE, LOOKUP L1, LOOKUP L2
WHERE VAL2 = 'Value1' 
AND VAL3 IN ('X', 'Y', 'Z') 
AND trim(VAL4) = trim(L1.KEY1)
AND L1.KEY2 = 'A'  
AND L1.KEY3 = 'B'
AND L1.FLAG = 'Y'
AND trim(VAL4) = trim(L2.KEY1 (+))
AND L2.KEY2 = 'A'  
AND L2.KEY3 = 'B'
AND L2.FLAG = 'N'
GROUP BY VAL1, L1.FLAG,  L2.FLAG

Wat ik hier wil doen is alle unieke waarden voor VAL1 ophalen waarvoor FLAG='Y' ik wil daarbij ook de de waarden ophalen waar FLAG='N' en deze in een kolom erachter zetten met een outerjoin. Op deze manier hoef ik hierna alleen de records te selecteren waarin FLAG1='Y' en FLAG2 IS NULL. Maar ook hier kom ik niet uit omdat deze record geen records oplevert...

[ Voor 14% gewijzigd door Deddiekoel op 01-10-2004 17:45 ]

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • BrZ
  • Registratie: Maart 2000
  • Laatst online: 20-05 16:16

BrZ

Ik zou het andersom doen:
Maak een subquery waar je alle rijen selecteert die een flag hebben die op N staat, en zorg er dan voor dat je de rest selecteert :)

  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
BrZ schreef op 01 oktober 2004 @ 17:55:
Ik zou het andersom doen:
Maak een subquery waar je alle rijen selecteert die een flag hebben die op N staat, en zorg er dan voor dat je de rest selecteert :)
Het probleem is dan dat je twee keer door heel de tabel heen moet. Deze query moet een onderdeel vormen van een andere query. Dit stukje moet dus zo efficient mogelijk...

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Wat dacht je van zoiets dan?
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
    SELECT DISTINCT VAL1
    FROM(
        SELECT DISTINCT VAL1, CASE L.FLAG WHEN 'Y' THEN 1 ELSE 0 END as FLAG
        FROM TABLE, LOOKUP L
        WHERE VAL2 = 'Value' 
        AND VAL3 IN ('X', 'Y', 'Z')    
        AND trim(VAL4) = trim(L.KEY1) 
        AND L.KEY2 = 'A'  
        AND L.KEY3 = 'B'
        GROUP BY VAL1, L.FLAG
    )
    GROUP BY VAL1
    HAVING SUM(FLAG)=COUNT(FLAG)


Oftewel, N = 0, Y = 1. Als er net zoveel FLAG's 1 zijn (SUM) als er in totaal zijn (COUNT) dan komt er true uit die HAVING. Maar overweeg ook BrZ's query, dat die de tabel anders moet benaderen zegt nog niet dat ie ook direct trager is :)

Trouwens die DISTINCT is wel dubbelop met de GROUP BY he? Dat komt de performance niet zo ten goede.

[ Voor 7% gewijzigd door ACM op 01-10-2004 18:43 ]


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
Ik heb BrZ's aanpak ook al geprobeert maar die leverde niet het juiste aantal records op... Maar ik zal daar nog eens naar kijken. ACM's oplossing lijkt mij iig ook goed!

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • Deddiekoel
  • Registratie: Maart 2000
  • Laatst online: 12-11-2025

Deddiekoel

Gadget nerd

Topicstarter
OK, de oplossing van ACM werkt als een trein. Maar ik heb toch nog een probleem. De server waarop deze query moet draaien is Oracle 8 en die snapt de CASE...WHEN constructie niet. Ik kan ook geen manuals ervan vinden (ben nog aan het zoeken) dus weet iemand of Oracle 8 iets van een IF...THEN achtige functie kent?

Verlanglijstje: Switch 2, PS5 Pro Most wanted: Switch 2


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Deddiekoel schreef op 05 oktober 2004 @ 09:10:
OK, de oplossing van ACM werkt als een trein. Maar ik heb toch nog een probleem. De server waarop deze query moet draaien is Oracle 8 en die snapt de CASE...WHEN constructie niet. Ik kan ook geen manuals ervan vinden (ben nog aan het zoeken) dus weet iemand of Oracle 8 iets van een IF...THEN achtige functie kent?
Dat kun je met decode oplossen.

Who is John Galt?

Pagina: 1