Если StartDate является столбцом varchar, вы не можете ожидать получения правильных результатов при выполнении большего, чем сравнение с ним. По сути, вы говорите, что любые значения, которые будут храниться в столбце StartDate, не должны сортироваться после или в '20 -JUN-10 '. Вы должны сделать StartDate фактическим DateTime. Таким образом, пока вы не сделаете это, вы должны привести его к DateTime и, поскольку он ссылается только на внешнюю таблицу, вы можете извлечь его из подзапроса:
Select ..
From TableA As A
Where ( A.StartDate Is Null Or Cast(A.StartDate As DateTime) < '2010-06-20' )
And Not Exists (
Select 1
From TableB As B
Where B.pid = A.pid
)
То, что StartDate не является действительным DateTime, является фундаментальной проблемой целостности данных и создает эту проблему вместе с множеством других, которые я себе представляю. Однако, если по какой-то безумной причине у вас есть значения, которые нельзя привести к DateTime в столбце StartDate, вам нужно добавить еще одну проверку (и шлепнуть оригинального администратора базы данных вверх ногами):
Select ..
From TableA As A
Where ( A.StartDate Is Null
Or (IsDate(A.StartDate) = 1 And Cast(A.StartDate As DateTime) < '2010-06-20' ) )
And Not Exists (
Select 1
From TableB As B
Where B.pid = A.pid
)