Whenever a Broker Query doesn't give me the results I expect, I head towards the MSSQL Query Profiler to see what actually happens on the database level.
I documented this process in an article on the Tridion practice wiki: http://code.google.com/p/tridion-practice/wiki/TroubleshootBrokerQueryGeneration .
A quick summary of the steps:
- start the MSSQL Query Profiler
- start a new Trace
- filter the trace on database name
- reload your page, so the query fires
- find the query in the Profiler
- copy the query into a better tool and reformat it
Once you reach step 6, it is often somewhat clear why there are no results. I often end up then modifying the SQL to give the results that I'm looking for. And from that I modify the Criteria to generate that SQL, which can at times be a challenge.