-1

のようなものを書きたいとき、私はよく立ち往生します

IF v_shortname IN (SELECT   sname FROM table)

また

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

私は EXISTS と IN がそのように機能しないことを知っています。また、コードを微調整してそのような結果を得ることができますが、SQL に仕事をするプログラミング構造があるかどうかは常に疑問です!

4

2 に答える 2

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

これを行う方法は他にもありますが、ネストされた関数のカプセル化が気に入っています。

于 2013-07-27T19:56:44.757 に答える
0

IFプレフィックスを取り除き、IN()そのEXISTS() ように作業する場合。

まず、使用するバージョンIN()は一般的に悪い考えです。パフォーマンスの観点からは、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)
于 2013-07-27T14:31:34.960 に答える