2014-04-10 163 views
-2

我想知道是否有更好的方式來編寫以下查詢:有沒有更好的方法來做這個查詢?

IF EXISTS (SELECT * 
      FROM master_list 
      WHERE code = 'r_params') 
    BEGIN 
     UPDATE master_list 
     SET code = 'w_params' 
     WHERE code = 'r_params' 
      AND NOT name_1 = 'pH' 
      AND NOT name_2 = 'Flow' 
      AND NOT name_3 = 'Temperature' 

     SELECT * 
     FROM r_master_list 
     WHERE code = 'r_params' 

     SELECT * 
     FROM r_master_list 
     WHERE code = 'w_params' 
    END 

感謝

+2

使用'<>',而不是'不=' –

+1

或使用'!='已經相同的意思 –

+0

什麼是你與你的代碼的實際問題?它沒有運行嗎?請指定一個具體的問題,因爲在堆棧溢出時,要求提供「更好」解決方案的問題是無關緊要的。 –

回答

0

SELECT 1可能會更快

IF EXISTS (SELECT 1 
      FROM master_list 
      WHERE code = 'r_params') 
    BEGIN 
     UPDATE master_list 
     SET code = 'w_params' 
     WHERE code = 'r_params' 
      AND name_1 <> 'pH' 
      AND name_2 <> 'Flow' 
      AND name_3 <> 'Temperature' 

     SELECT * 
     FROM r_master_list 
     WHERE code = 'r_params' 

     SELECT * 
     FROM r_master_list 
     WHERE code = 'w_params' 
    END 
+0

你確定嗎?我會認爲'EXISTS'函數足夠聰明,不會返回任何字段...... – Crono

+0

@Crono我相信實際上可能會對此問題進行一些辯論: http://blog.sqlauthority.com/2008/02/26/sql-server-select-1-vs-select-an-interesting-觀察/ – Drew

+0

http://www.execsql.com/post/the-select-1-vs-select-in-exists-conondrum – Drew

0
if exists (select * from MASTER_LIST where Code = 'r_params') 
begin 
    update MASTER_LIST 
     set Code = 'w_params' 
     where Code = 'r_params' 
     AND Name_1 <> 'pH' 
     AND Name_2 <> 'Flow' 
     AND Name_3 <> 'Temperature' 

select * from R_MASTER_LIST WHERE Code = 'r_params' 

select * from R_MASTER_LIST WHERE Code = 'w_params' 
end 
0

暫且不論形式客戶期望接收數據,更好的方法是將兩個結果集組合成一個

IF EXISTS (SELECT * 
    FROM master_list 
    WHERE code = 'r_params') 
BEGIN 
    UPDATE master_list 
    SET code = 'w_params' 
    WHERE code = 'r_params' 
     AND name_1 <> 'pH' 
     AND name_2 <> 'Flow' 
     AND name_3 <> 'Temperature' 

    SELECT * 
    FROM r_master_list 
    WHERE code IN ('r_params', 'w_params') 
END 

這樣,你是在r_master_list而不是兩個做一個查詢。客戶將收到完全相同的數據;只有他有責任將其分爲不同的結果集,如果他需要的話。性能和效率方面,這應該是首選解決方案。

UPDATE:

正如德魯建議你也可能想使你的`存在」功能子查詢是這樣,而不是:

IF EXISTS (SELECT 1 
FROM master_list 
    WHERE code = 'r_params') 

有過這種更有效率或不太辯論。德魯似乎相信它是;我無法分辨。但! Drew沒有提到這種方法仍然有一個優勢:如果您想要在整個代碼庫中查找使用*SELECT查詢,您會發現所有EXISTS函數子查詢都使用SELECT 1模式以方便您獲勝沒有必要向那些人伸出援手。它可能並不多,但我仍然認爲這值得一提。

0

這是多餘的
其中關於更新的條件是其代碼=「r_params」

IF EXISTS (SELECT * 
      FROM master_list 
      WHERE code = 'r_params') 

這足以

UPDATE master_list 
    SET code = 'w_params' 
    WHERE code = 'r_params' 
     AND NOT name_1 = 'pH' 
     AND NOT name_2 = 'Flow' 
     AND NOT name_3 = 'Temperature' 

    SELECT * 
    FROM r_master_list 
    WHERE code = 'r_params' 

    SELECT * 
    FROM r_master_list 
    WHERE code = 'w_params' 

唯一的區別是,你會得到最後的選擇即使是沒有'r_params'

最後兩個可以合併

SELECT * 
    FROM r_master_list 
WHERE code in ('r_params','w_params') 
order by code 
相關問題