@bir kac yazar once, yukaridaki editim gozden kacabilir, dogru cevabi orada verdim (diye tahmin ediyorum).
soluman'in calistirdigi
select * from table where egitim='x' and egitim='y'
ve senin onerdigin
select * from table where egitim='x' and egitim='y'
sorgularinin ikisi de anlamsiz, bunu satir satir evaluate edin, ilk sorguda bir satirdaki egitim degerinin hem x hem y olmasi mumkun olmadigindan dolayi sorgu sonucu bos donecek, senin onerdiginde de bir satirdaki egitim degeri x ise zaten y olamayacagindan butun x'ler donecek.
benim onerdigim sorguda:
select count(egitim),firstname,lastname from table where (egitim='x' or egitim='y') group by firstname,lastname having count(egitim)=2;
ise diyorum ki egitim'i x veya egitimi y olan satirlari cek, bu satirlari ad ve soyadin ayni olmas kriterine gore gruplandir ve egitim kolonunda da gelen sonuc sayisini say. eger ki bu sayi 2 ise sahis hem x hem y egitimini almistir (yani having sarti). having olmasaydi count(egitim)'i 1 olanlar sadece birinden birini almis olanlar olacakti. 0 olamaz zaten.
bu sorgu veritabaninda duplicate satir olmadigindan eminseniz dogru calisir. yoksa once tabloyu distinc ile filtrelemek gerekir, soyle bir sey olur:
select count(egitim),firstname,lastname from (select distinct * from table) t where (egitim='x' or egitim='y') group by firstname,lastname having count(egitim)=2;
SON EDIT: Kusura bakmayin, ortam karisinca soluman'in ikinci post'undaki soruya cevap vermis, ana soruyu atlamisim. dogru cevap soyle olsa gerek:
select distinct firstname,lastname from table where egitim='x' MINUS select distinct forstname,lastname from table where egitim='y';
0