[SQL] "Not Exists" als aggregate

Pagina: 1
Acties:

  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 01-12 23:43

GrimaceODespair

eens een tettenman, altijd ...

Topicstarter
IDProp
1A
1B
1<null>
2A
3A
3B

Ik heb bovenstaande tabel, en ik zou graag alle unieke id's hieruit filteren die geen null-waardes hebben in hun Prop-kolom. Dat zijn hier dus 2 en 3.

Het liefst zou ik dit klaarspelen zonder subqueries, maar kan dat uberhaupt?

Als het zou bestaan, zou ik iets doen als
SQL:
1
2
3
4
select *
from T
group by ID
having not exists (Prop is null)


Is het eigenlijk ongelofelijk gemakkelijk en zie ik iets over het hoofd, of kan wat ik wil niet zonder subqueries?

Wij onderbreken deze thread voor reclame:
http://kalders.be


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

zoiets?

SQL:
1
2
3
select distinct ID
from T t1
where not exists (select * from T t2 where t2.ID =  t1.ID and prop is null)


of heel vies zoiets:
SQL:
1
2
3
4
select ID
from T
group by ID
having count(*) = sum(case when Prop is null then 0 else 1 end)


Ik snap iig niet wat er tegen subqueries zou zijn?

[ Voor 11% gewijzigd door ACM op 07-11-2006 16:51 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
SQL:
1
2
3
4
SELECT DISTINCT P1.id
FROM PropTable p1
LEFT OUTER JOIN #PropTable p2 ON P1.Id = P2.Id AND P2.Prop IS NULL
WHERE P2.Id IS NULL


Je JOINed de tabel met zichzelf waarbij je expliciet ook de voorwaarde opneemt dat Prop NULL is, alle records die niet aan deze join criteria voldoen heb jij nodig.

Volgens mij moet dit werken

Oops! Google Chrome could not find www.rijks%20museum.nl


  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 01-12 23:43

GrimaceODespair

eens een tettenman, altijd ...

Topicstarter
ACM schreef op dinsdag 07 november 2006 @ 16:48:
Ik snap iig niet wat er tegen subqueries zou zijn?
Nou, op zich is er niets tegen subqueries, maar de select waar ik tegenaan kijk is het resultaat van een redelijk omvangrijke join. Ik kan het in een tijdelijke tabel gaan stoppen, of het in een subquery nog eens uitvoeren, maar als het niet hoeft, liever niet dus.

Maar los daarvan bedacht ik me net het volgende:
SQL:
1
2
3
4
select * 
from T 
group by ID 
having count(Prop) = count(*)

Wij onderbreken deze thread voor reclame:
http://kalders.be


  • JeroenTheStig
  • Registratie: Mei 2000
  • Nu online
edit

whoops, verkeerd gelezen

[ Voor 76% gewijzigd door JeroenTheStig op 07-11-2006 16:57 ]


Verwijderd

Het is natuurlijk onzin om dit niet via een subquery te doen, maar goed het kan wel:


SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
create table #temp (i int , b varchar(200))
go

insert #temp values (1,  'A')
insert #temp values (1,  'B')
insert #temp values (1,  null)
insert #temp values (2,  'A')
insert #temp values (3,  'A')
insert #temp values (3,  'B')

SELECT * FROM #temp

SELECT DISTINCT t1.i
  FROM #temp t1
  LEFT JOIN (
                SELECT DISTINCT t1.i
                  FROM #temp t1
                 INNER JOIN #temp t2
                    ON t1.i = t2.i
                 WHERE t2.b IS NULL
            ) t2
    ON t1.i = t2.i
 WHERE t2.i is null

DROP  table #temp

  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 01-12 23:43

GrimaceODespair

eens een tettenman, altijd ...

Topicstarter
GrimaceODespair schreef op dinsdag 07 november 2006 @ 16:55:
[...]
Maar los daarvan bedacht ik me net het volgende:
SQL:
1
2
3
4
select * 
from T 
group by ID 
having count(Prop) = count(*)
Wat natuurlijk niet werkt, want Prop komt niet voor in de Group By...

zie oisyn hieronder...

[ Voor 4% gewijzigd door GrimaceODespair op 07-11-2006 17:17 ]

Wij onderbreken deze thread voor reclame:
http://kalders.be


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:56

.oisyn

Moderator Devschuur®

Demotivational Speaker

SQL:
1
2
3
4
select *
from T
group by ID
having sum(Prop is null) = 0
GrimaceODespair schreef op dinsdag 07 november 2006 @ 17:04:
[...]

Wat natuurlijk niet werkt, want Prop komt niet voor in de Group By...
Je gebruikt ook niet Prop maar een aggregate functie die op Prop werkt, wat uiteraard wel mag

[ Voor 131% gewijzigd door .oisyn op 07-11-2006 17:16 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Is dit niet een mooi geval voor een EXCEPT? Of MINOR voor Oraclezen? :P

Iets van:
SQL:
1
2
3
4
5
6
7
SELECT id
FROM t
GROUP BY id
EXCEPT
SELECT id
FROM t
WHERE prop IS NULL

(Even uit het blote hoofd ingeklopt) :)

Fat Pizza's pizza, they are big and they are cheezy


  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 01-12 23:43

GrimaceODespair

eens een tettenman, altijd ...

Topicstarter
.oisyn schreef op dinsdag 07 november 2006 @ 17:09:
SQL:
1
2
3
4
select *
from T
group by ID
having sum(Prop is null) = 0



[...]

Sinds wanneer mag je alleen kolommen in de HAVING clause gebruiken die in de GROUP BY clause voorkomen :?. Volgens mij ben je in de war met de regel dat je alleen kolommen in de SELECT clause mag gebruiken die in de GROUP BY voorkomen, tenzij je er een aggregate functie op los laat.
Je hebt natuurlijk helemaal gelijk :) Problem solved ;)

Wij onderbreken deze thread voor reclame:
http://kalders.be


  • momania
  • Registratie: Mei 2000
  • Laatst online: 19:27

momania

iPhone 30! Bam!

JKVA schreef op dinsdag 07 november 2006 @ 17:13:
Is dit niet een mooi geval voor een EXCEPT? Of MINOR voor Oraclezen? :P
Meer iets voor een decode denk ik
SQL:
1
2
3
4
select ID
from T
group by ID
having sum(decode(Prop, NULL, 1, 0)) = 0
:)

Neem je whisky mee, is het te weinig... *zucht*


  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 01-12 23:43

GrimaceODespair

eens een tettenman, altijd ...

Topicstarter
Het gaat hier overigens over T-SQL, maar het liefst gebruik ik natuurlijk ANSI-SQL.

Wij onderbreken deze thread voor reclame:
http://kalders.be

Pagina: 1