2012-12-03 18 views
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 

我可以一直使用第二個查詢,但它似乎是一個相當昂貴(加入,子等)......我有一個像數以百萬計需要弄清楚,拉姆值的主板。因爲(在我的數據中)不同部件具有不同內存的概率非常少(如1%),所以我想應用第一個查詢,並應用第二個查詢。

如果你知道如何編寫,結合這兩個類似的查詢:

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

或者創建一個輔助功能。

請分享。

+6

我可以在「SUBSTRING」連接上說「eww」嗎? :如果你有'a'索引,P'a LIKE b +'%''應該會更快。更好的是,將密鑰隔離到自己的列中 - 最好是浪費磁盤空間而不是用戶的時間 - 然後定期進行左連接;加入黑客'model_id_and_other_stuff'是非常不理想的。 – Amadan

+0

model_id_and_other_stuff作爲字段名稱是您需要重新設計表格的線索。你不應該在一個字段中存儲多條信息,然後必須使用子字符串將其排除。如果你需要加入那個更糟糕的領域!請重構以解決您非常基本的設計缺陷。 – HLGEM

回答

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在你JOIN的(MIS)使用的SUBSTRING