我有一个表(例如Motherboard
),其中包含我正在寻找的值(例如RAM
)...并且说主板有2个字段作为PK,例如:model_id
和part_number
...
如果我有model_id并且所有RAM容量都相同,我不关心部件号。查询将类似于:
SELECT Top 1 ram FROM Motherboard WHERE model_id = @model_id
否则,我们必须加入我们存储part_number的表格(例如MyMBInfo
)。
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...)
或者创建辅助函数。
请分享。
答案 0 :(得分: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
实际的查询执行计划将根据条件而有所不同,因此您只应推断必要的成本。
非主题:我非常关注@Amadan关于SUBSTRING
中JOIN
的使用情况。