如何申请加入只需要它

时间:2012-12-03 23:27:20

标签: sql sql-server tsql

我有一个表(例如Motherboard),其中包含我正在寻找的值(例如RAM)...并且说主板有2个字段作为PK,例如:model_idpart_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...)

或者创建辅助函数。

请分享。

1 个答案:

答案 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关于SUBSTRINGJOIN的使用情况。