2013-07-27 37 views
-1

我常常會被卡住的時候,我想寫成纔像存在,沒有選擇使用,INSERT和UPDATE查詢

IF v_shortname IN (SELECT sname FROM table) 

OR

IF EXISTS (SELECT sname FROM mmstrephdr 
WHERE sname= v_short) 

我知道其存在,並在這種方式行不通。我也可以隨時調整我的代碼來獲得這樣的結果,但是我總是想知道是否有一個SQL中的編程構造可以爲我完成這項工作!

+2

你能寫出來的,你是試圖代碼的問題? –

+0

類似的問題:http://stackoverflow.com/questions/24929/difference-between-exists-and-in-in-sql – Verma

+0

@Verma這怎麼是一個類似的問題。再次嘗試讀取我的問題張貼對鏈接的問題 – kushalvm

回答

0

如果你擺脫IF前綴,IN()EXISTS()工作的方式。

首先,使用IN()的版本通常是一個糟糕的想法™ - 在性能方面,使用JOIN或派生表而不是WHERE子句中的子查詢更好。

-- instead of: 
SELECT * FROM tbl1 WHERE tbl1.v_short IN (SELECT tbl2.sname FROM tbl2) 

-- you would want something like: 
SELECT tbl1.* FROM tbl1 JOIN tbl2 ON (tbl2.sname = tbl1.v_short) 

EXISTS()另一方面是非常有用的。它優化爲相同的INNER JOIN,而NOT EXISTS()是相同的左連接與IS NULL檢查。 [NOT] EXISTS()版本更容易閱讀,就好像它是英文版本。請注意,在EXISTS中將列列表傳遞給SELECT沒有意義 - 它不會被使用,它每次都會被優化爲SELECT *。

-- easy to read: 
SELECT * FROM tbl1 WHERE EXISTS (SELECT * FROM tbl2 WHERE tbl2.sname = tbl1.v_short) 

-- same thing, just more SQL-like than English-like: 
SELECT tbl1.* FROM tbl1 JOIN tbl2 ON (tbl2.sname = tbl1.v_short) 
+0

在你的第一行中,你刪除了「IF」。那是我不想做的。我知道我可以調整和使用輕鬆選擇來獲得結果。但我不明白爲什麼不應該這樣工作。我的意思是直接比較SELECT語句的結果 - 不在SELECT查詢中 - 但在IF條件下。或者如果我談到我上面的第二個查詢,如果我只想知道我的選擇查詢是否返回了某些內容,該怎麼辦?爲什麼我必須編寫'select ... into'語句來檢查結果?我只是想知道這是否有可能? – kushalvm

+0

您的原始問題和後續問題不夠詳盡,無法提供完整答案 - 仍然不知道您真正想要完成的任務。也許你試圖在存儲過程中將這些'IF'測試寫爲條件邏輯而不是正則'SELECT'語句? 在使用'SELECT'語句中'IN'和'EXISTS'的情況下,這兩個已經附加有一個「隱'IF'」。檢查在另一個表中是否包含或存在一個值*是一個條件邏輯測試......您不需要額外的「IF」。 – 2013-07-27 15:48:42

+0

哦,如果你不嘗試選擇任何實際的表中的數據,只是想要一個簡單的是/否的答案是否存在的數據,你還要做一個SELECT(你不能從數據庫中檢索的任何值沒有SELECT)。例如:'SELECT IF(EXISTS(SELECT * FROM tbl1 WHERE),'yes','no')' – 2013-07-27 15:51:31

0

爲什麼你卡住了? PL/SQL提供了允許我們實現該邏輯的構造。

declare 
    ..... 
    function name_exists (p_sname table_a.sname%type) 
     return boolean 
    is 
     l_shortname table_a.sname%type; 
    begin 
      SELECT sname 
      FROM table_a 
      where sname = p_sname; 
      return true; 
     exception 
      when no_data_found then 
       return false; 
    end name_exists; 
.... 
begin 
    .... 
    if name_exists ('KNOX') then 

還有其他方法可以做到這一點,但我喜歡封裝的嵌套功能。

相關問題