Подтвердить что ты не робот

Какой самый эффективный способ проверить, существует ли запись в Oracle?

A)

select decode(count(*), 0, 'N', 'Y') rec_exists
from (select 'X'
      from dual
      where exists (select 'X'
                    from sales
                    where sales_type = 'Accessories'));

В)

select decode(count(*), 0, 'N', 'Y') rec_exists
from (select 'X'
      from sales
      where sales_type = 'Accessories'); 

C) Что-то еще (указать)

РЕДАКТИРОВАТЬ: Трудно было выбрать правильный ответ, так как наилучший подход зависит от того, что вы хотите сделать после проверки того, существует ли значение, о чем указывает APC. Я закончил тем, что выбрал ответ RedFilter, так как я первоначально предполагал эту проверку как функцию сам по себе.

4b9b3361

Ответ 1

select case 
            when exists (select 1 
                         from sales 
                         where sales_type = 'Accessories') 
            then 'Y' 
            else 'N' 
        end as rec_exists
from dual;

Ответ 2

Какова основная логика, которую вы хотите реализовать? Если, например, вы хотите проверить наличие записи для определения вставки или обновления, лучшим выбором было бы использовать MERGE вместо этого.

Если вы ожидаете, что запись будет существовать большую часть времени, это, вероятно, самый эффективный способ делать вещи (хотя решение CASE WHEN EXISTS, вероятно, будет так же эффективно):

begin
    select null into dummy
    from sales
    where sales_type = 'Accessories'
    and rownum = 1;

    --  do things here when record exists
    ....        

exception
    when no_data_found then
        -- do things here when record doesn't exists
        .....
end;

Вам нужна только строка ROWNUM, если SALES_TYPE не уникален. Нет смысла делать подсчет, когда все, что вы хотите знать, - существует ли хотя бы одна запись.

Ответ 3

select count(1) into existence 
   from sales where sales_type = 'Accessories' and rownum=1;

План Oracle говорит, что он стоит 1, если индексируется индекс seles_type.

Ответ 4

здесь вы можете проверить только y, n если нам нужно также выбрать имя, независимо от того, существует ли это имя или нет.

select name , decode(count(name),0, 'N', 'Y')
  from table
 group by name;

Здесь, когда это Y, тогда он будет возвращать выход, иначе он будет давать null всегда. Какой способ получить записи, не существующие с N, как в выводе, мы получим Name, N. Когда имя не существует в таблице

Ответ 5

select decode(count(*), 0, 'N', 'Y') rec_exists 
      from sales 
      where sales_type = 'Accessories'; 

Ответ 6

select NVL ((select 'Y' from  dual where exists
   (select  1 from sales where sales_type = 'Accessories')),'N') as rec_exists
from dual

Таблица 1.Dual вернет 'Y', если запись существует в таблице sales_type Таблица 2.Dual возвращает значение null, если в таблице sales_type нет записи, а NVL преобразует ее в 'N'

Ответ 7

Самый эффективный и безопасный способ определить, существует ли строка, используя FOR-LOOP... У вас даже не будет трудного времени, если вы хотите вставить строку или сделать что-то на основе строки NOT, но это, безусловно, поможет вам, если вам нужно определить, существует ли строка. См. Пример кода ниже для входов и выходов...

Если вам интересно только знать, что в вашем потенциальном множественном наборе ответов существует 1 запись, вы можете выйти из цикла после того, как она впервые попадет в нее.

Петля вообще не будет введена, если запись не существует. Вы не получите никаких жалоб от Oracle или таких, если строка не существует, но вы обязательно узнаете, что она делает независимо. Его то, что я использую в 90% случаев (конечно, зависит от моих потребностей)...

ПРИМЕР:

DECLARE

v_exist varchar2(20);

BEGIN
   FOR rec IN
   (SELECT LOT, COMPONENT 
   FROM TABLE
   WHERE REF_DES = (SELECT REF_DES FROM TABLE2 WHERE ORDER = '1234') 
   AND ORDER = '1234')
  LOOP

      v_exist := "IT_EXISTS"

   INSERT INTO EAT_SOME_SOUP_TABLE (LOT, COMPONENT) 
   VALUES (rec.LOT, rec.COMPONENT);**

   --Since I don't want to do this for more than one iteration (just in case there may have been more than one record returned, I will EXIT;

   EXIT;
   END LOOP;



IF v_exist  IS NULL

    THEN

            --do this

END IF;

END;

- Это вне цикла прямо здесь. IF-CHECK чуть выше будет работать независимо, но тогда вы узнаете, является ли ваша переменная нулевой или не прав!?. Если бы не было никаких возвращенных записей, он пропустил бы цикл и просто перешел сюда к следующему коду... Если (в нашем случае выше), было возвращено 4 записи, я бы вышел после первой итерации из-за моего EXIT;... Если этого не было, 4 записи будут проходить через и вставлять их во все. Или, по крайней мере, попробуйте тоже.

Кстати, я не говорю, что это единственный способ, которым вы должны это делать... Вы можете

SELECT COUNT(*) INTO v_counter WHERE ******* etc...

Затем проверьте его как

if v_counter > 0
      THEN
         --code goes here
   END IF;

Есть больше способов... Просто определите, когда возникнет ваша потребность. Помните о производительности и безопасности.

Ответ 8

Просто введите количество записей, которые вы ищете. Если count > 0, то записи существуют.

    DECLARE
    rec_count NUMBER := 0;

    BEGIN

    select count(*) 
    into rec_count  
    from EMPLOYEETABLE  
    WHERE employee_id = inEMPLOYEE_ID  
    AND department_nbr = inDEPARTMENT_NBR;  


    if rec_count > 0 then  
       {UPDATE EMPLOYEETABLE}
    else  
       {INSERT INTO EMPLOYEETABLE}  
    end if;  

    END;

Ответ 9

SELECT 'Y' REC_EXISTS             
FROM SALES                       
WHERE SALES_TYPE = 'Accessories'

Результат будет либо "Y", либо "NULL". Просто протестируйте против "Y"