Nevím, co máte přesně na mysli, ale u Firebirda mi
select ... from TBL1 A where (select count(*) from TBL2 B where B.COL2=A.COL1)=0
dá přesně totéž, co (podstatně vhodnější)
select ... from TBL1 A where not exists (select * from TBL2 B where B.COL2=A.COL1)
nebo
select ... from TBL1 A left join TBL2 B on B.COL2=A.COL1 where B.COL2 is null
a nedokážu si dost dobře představit, proč by měl být výsledek různý.
having count(*)=0". Pak to samozřejmě nemůže fungovat, protože u left join bude ve výsledku vždy minimálně jeden řádek a u inner join nebude sice žádný, ale pak taky nebude co dát do result set. Ale vaše původní tvrzení, že pomocí count(*) to nejde, není určitě pravdivé; jde to, jen se musí použít správně.