2013-07-27 2 views
-1

я часто застревают, когда я хочу написать коснуться какEXISTS, IN использование без SELECT, INSERT и UPDATE запросов

IF v_shortname IN (SELECT sname FROM table) 

ИЛИ

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

Я знаю, EXISTS и IN не работает таким образом .Также я всегда могу настроить свой код, чтобы получить такие результаты, но я всегда задаюсь вопросом, есть ли в 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() идентичен LEFT JOIN с проверкой IS NULL. Версия [NOT] EXISTS() просто читается так, как будто это был английский. Обратите внимание, что нет смысла передавать список столбцов SELECT в EXISTS - он не используется, он оптимизируется как 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 что-то. Почему мне нужно написать инструкцию 'select ... in' для проверки результатов? Я просто хотел узнать, возможно ли это так или иначе? – kushalvm

+0

Ваш исходный вопрос и последующие вопросы недостаточно подробны, чтобы дать полный ответ - до сих пор не знаю, чего вы действительно пытаетесь достичь. Возможно, вы пытаетесь записать эти тесты «IF» в хранимой процедуре как условную логику, а не в регулярный оператор SELECT? В случае использования 'IN' и' EXISTS' в операторе 'SELECT', оба из них уже имеют« неявный 'IF'», прикрепленный к ним. Проверка включения или существования значения в другой таблице уже * является * условным логическим тестом ... вам не нужен дополнительный 'IF'. –

+0

О, если вы не пытаетесь выбрать какие-либо фактические данные таблицы и просто хотите получить простой ответ «да/нет» о том, существуют ли данные, вам все равно нужно сделать SELECT (вы не можете получить какое-либо значение из базы данных без SELECT). Что-то вроде: 'SELECT IF (EXISTS (SELECT * FROM tbl1 WHERE), 'yes', 'no')' –

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 

Есть и другие способы сделать это, но мне нравится инкапсуляция вложенной функции.