Your issue is you are doing an INNER JOIN, which requires the record to exist in BOTH tables (DEs) in order to be returned. The OPs code is basically saying return all records that match on both tables but are empty on the second one. Since it cannot exist but also not exist, it returns 0.
As you are looking for records that are both in and NOT in the _Click DV, this is causing you to return 0 results.
What you want to do is instead utilize a LEFT JOIN (pulls all results from initial table (de) and any that match in second (de).
By then pulling only records that have a click subID of null, it will remove any matches and will instead only pull those in the send log that are not in click.
Like this:
select se.EmailAddress
,se.TimeStamp as sentdate
from SendLog se
left join [_click] cl
on se.JobID=cl.JobID and se.BatchID=cl.BatchID and se.SubID=cl.SubscriberID
where se.EmailName_ = 'hello' and cl.SubscriberID is null
Another option too is to instead utilize NOT EXISTS
instead of a left join.
Something like:
select se.EmailAddress
,se.TimeStamp as sentdate
from SendLog se
WHERE NOT EXISTS (
SELECT TOP 1 cl.SubscriberID FROM [_click] cl
WHERE se.JobID=cl.JobID and se.BatchID=cl.BatchID and se.SubID=cl.SubscriberID
)
AND se.EmailName_ = 'hello'
They will likely process and function the same, so its more a matter of preference.