1

我有一个表(例如Motherboard),其中包含我正在寻找的值(例如RAM)...并假设主板有 2 个字段作为 PK,例如:model_idpart_number...如果我有 model_id 和所有RAM容量相同我不在乎零件编号。查询将类似于:

SELECT Top 1 ram FROM Motherboard WHERE model_id = @model_id 

否则,我们必须加入MyMBInfo存储该part_number 的表(例如)。

SELECT Top 1 ram FROM Motherboard m
    LEFT JOIN MyMBInfo i ON SUBSTRING(i.model_id_and_other_stuff, 1, 9) = m.model_id and i.part_number = m.part_number
    WHERE model_id = @model_id 

我总是可以使用第二个查询,但它似乎是一个相当昂贵的(连接、子字符串等)......我有数百万需要计算 Ram 值的主板。

我想应用第一个查询,如果需要,应用第二个查询,因为(在我的数据中)不同部分具有不同 RAM 的概率非常罕见(如 1%)。

如果您可能知道如何编写将这两者结合起来的查询,例如:

SELECT Top 1 ram ... WHERE .... distinct_counter > 1 and part_number in SELECT ... FROM MyMBInfo WHERE...)

或者创建一个辅助函数。

请分享。

4

1 回答 1

1

一个简单的IF就可以了:

if (select count(distinct ram) from dbo.Motherboard WHERE model_id = @model_id) = 1
    select ram from dbo.Motherboard WHERE model_id = @model_id 
else 
    SELECT Top 1 ram FROM Motherboard m
            LEFT JOIN MyMBInfo i ON SUBSTRING(i.model_id_and_other_stuff, 1, 9) = m.model_id and i.part_number = m.part_number
            WHERE model_id = @model_id 

实际的查询执行计划会因条件而异,因此您应该只推断必要的成本。

题外话:我非常赞同@AmadanSUBSTRING在你的JOIN.

于 2012-12-05T20:44:18.927 回答