В первом запросе большую часть фильтрации можно выполнить, просматривая только одну таблицу (tpersonTypeCodeMap).Во втором примере необходимо объединить две таблицы для выполнения фильтрации.Кроме того, когда вы вводите «ИЛИ», вы теряете эффект любого индекса.
Действительно ли верно, что вы хотите, чтобы «ИЛИ» работало с этими двумя фильтрами, а не «И»?Кроме того, верно ли, что вы хотите, чтобы возвращалось несколько записей на человека, в зависимости от того, сколько типов кодов они соответствуют и сколько кодов Hobby они не соответствуют ?
Если условие "ИЛИ" имеет значение,фактически, то, что вы хотите, вы можете использовать:
SELECT tPerson.Name, tPerson.Town
FROM tPerson JOIN tPersonTypeCodeMap
ON tPersonTypeCodeMap.PersonId = tPerson.Id
WHERE tPersonTypeCodeMap.TypeCode IN ('C', 'S', 'P')
UNION
SELECT tPerson.Name, tPerson.Town JOIN tPersonHobbyCodeMap
ON tPersonHobbyCodeMap.PersonId = tPerson.Id
WHERE tPersonHobbCodeMap.HobbyCode NOT IN ('SKATE','CLIMBING')
Это позволит получить два набора записей независимо, а затем объединить их вместе.При использовании UNION вместо UNION ALL будет возвращена операция DISTINCT, чтобы преобразовать базу данных в уникальные строки.