相关的查询往往比不相关的查询效率要低得多(如果这样的查询是可能的)。在这种情况下,我会尝试以下方法:
SELECT DISTINCT tp.parts_group as PartsGroup, tpf.code as FeatureCode, CONVERT(tpf.market_id, char) as MarketID
FROM jpt_product_feature tpf
INNER JOIN jpt_product tp ON tpf.product_id = tp.id
INNER JOIN jpt_product_model tpm ON tp.model_id = tpm.id
INNER JOIN ModelImport mi ON tpm.Code = mi.ModelCode
LEFT JOIN (
SELECT DISTINCT 1 AS matchCheck
, fs.PartsGroup AS fsPartsGroup
, fs.FeatureCode AS fsFeatureCode
, fs.MarketID AS fsMarketID
FROM FeatureSequence fs
) AS fs ON tp.parts_group = fs.fsPartsGroup
AND tpf.code = fs.fsFeatureCode
AND (tpf.market_id = fs.fsMarketID OR tpf.market_id is null)
WHERE fs.matchCheck IS NULL
ORDER BY PartsGroup, FeatureCode, MarketID
;
如果不知道数据分布的细节,就很难判断这是否会更快(在某些情况下,相关子查询是最佳选择);但这是我要做的第一件事。如果FeatureSequence与涉及的其他表相比相对较大,那么相关查询可能仍然更好(针对一个大表的许多小命中与单个大命中)。