У меня есть запрос, который использует несколько подзапросов.Это около 100 строк, поэтому я опущу это.Проблема заключается в том, что у меня есть несколько строк, возвращаемых как часть одного подзапроса, которые необходимо объединить с целочисленным значением из основного запроса.Вот так:
Select
... columns ...
from
... tables ...
(
select
... column ...
from
... tables ...
INNER JOIN core.Type mt
on m.TypeID = mt.TypeID
where dpt.[DataPointTypeName] = 'TheDataPointType'
and m.TypeID in (100008, 100009, 100738, 100739)
and datediff(d, m.MeasureEntered, GETDATE()) < 365 -- only care about measures from past year
and dp.DataPointValue <> ''
) as subMdp
) as subMeas
on (subMeas.DataPointValue NOT LIKE '%[^0-9]%'
and subMeas.DataPointValue = cast(vcert.IDNumber as varchar(50))) -- THIS LINE
... more tables etc ...
Проблема в том, что, если я достану cast(vcert.IDNumber as varchar(50)))
, он попытается сравнить значение типа 'daffodil' с числом, подобным 3245. Даже если точка данных, содержащая 'daffodil'является бесхозной записью, которую следует отфильтровать по INNER JOIN
4 строкам над ней.Это работает нормально, если я пытаюсь сравнить строку со строкой, но взрывается, если я пытаюсь сравнить строку с целым числом - даже если у меня есть предложение там, чтобы посмотреть только на вещи, которые можно преобразовать в целые числа: NOT LIKE '%[^0-9]%'
.Если я специально отфильтрую запись, содержащую «нарцисс», тогда все в порядке.Если я переместу строку NOT LIKE
в подзапрос, она все равно потерпит неудачу.Это как NOT LIKE
оценивается последним независимо от того, что я делаю.
Таким образом, реальный вопрос заключается в том, почему SQL будет оценивать предложение JOIN, прежде чем оценивать предложение WHERE, содержащееся в подзапросе.Также, как я могу заставить его оценивать предложение JOIN только в том случае, если оцениваемое значение конвертируется в INT.Кроме того, почему это будет оценка записи, которая определенно не будет присутствовать после применения INNER JOIN.
Я понимаю, что здесь присутствует сильный элемент оптимизатора запросов voodoo .С другой стороны, я говорю это сделать INNER JOIN, а оптимизатор специально игнорирует это.Я хотел бы знать почему.