EXISTS,IN使用没有SELECT,INSERT和UPDATE查询

时间:2013-07-27 14:09:14

标签: sql oracle plsql

当我想写像

这样的东西时,我常常陷入困境
IF v_shortname IN (SELECT   sname FROM table)

OR

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

我知道EXISTS和IN不能以这种方式工作。也可以随时调整我的代码来获得这样的结果,但我总是想知道SQL中是否有一个编程结构可以帮我完成工作!

2 个答案:

答案 0 :(得分:0)

如果您摆脱了IF前缀,IN()EXISTS() 以这种方式工作。

首先,使用IN()的版本通常是Bad Idea™ - 性能方面,在WHERE子句中使用JOIN或派生表而不是子查询要好得多。

-- 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检查的LEFT JOIN相同。 [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)

答案 1 :(得分: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

还有其他方法可以做到这一点,但我喜欢嵌套函数的封装。