What's the most efficient way to check if a record exists in Oracle?

前端 未结 10 1974
刺人心
刺人心 2020-12-23 03:10

A)

select decode(count(*), 0, \'N\', \'Y\') rec_exists
from (select \'X\'
      from dual
      where exists (select \'X\'
                    from sales
           


        
相关标签:
10条回答
  • 2020-12-23 03:44

    The most efficient and safest way to determine if a row exists is by using a FOR-LOOP... You won't even have a difficult time if you are looking to insert a row or do something based on the row NOT being there but, this will certainly help you if you need to determine if a row exists. See example code below for the ins and outs...

    If you are only interested in knowing that 1 record exists in your potential multiple return set, than you can exit your loop after it hits it for the first time.

    The loop will not be entered into at all if no record exists. You will not get any complaints from Oracle or such if the row does not exist but you are bound to find out if it does regardless. Its what I use 90% of the time (of course dependent on my needs)...

    EXAMPLE:

    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;
    

    --This is outside the loop right here The IF-CHECK just above will run regardless, but then you will know if your variable is null or not right!?. If there was NO records returned, it will skip the loop and just go here to the code you would have next... If (in our case above), 4 records were returned, I would exit after the first iteration due to my EXIT;... If that wasn't there, the 4 records would iterate through and do an insert on all of them. Or at least try too.

    By the way, I'm not saying this is the only way you should consider doing this... You can

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

    Then check it like

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

    There are more ways... Just determine it when your need arises. Keep performance in mind, and safety.

    0 讨论(0)
  • 2020-12-23 03:49

    What is the underlying logic you want to implement? If, for instance, you want to test for the existence of a record to determine to insert or update then a better choice would be to use MERGE instead.

    If you expect the record to exist most of the time, this is probably the most efficient way of doing things (although the CASE WHEN EXISTS solution is likely to be just as efficient):

    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;
    

    You only need the ROWNUM line if SALES_TYPE is not unique. There's no point in doing a count when all you want to know is whether at least one record exists.

    0 讨论(0)
  • 2020-12-23 03:52
    select count(1) into existence 
       from sales where sales_type = 'Accessories' and rownum=1;
    

    Oracle plan says that it costs 1 if seles_type column is indexed.

    0 讨论(0)
  • 2020-12-23 03:52

    here you can check only y , n if we need to select a name as well that whether this name exists or not.

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

    Here when it is Y only then it will return output otherwise it will give null always. Whts ths way to get the records not existing with N like in output we will get Name , N. When name is not existing in table

    0 讨论(0)
  • 2020-12-23 03:55
    select CASE 
    when exists (SELECT U.USERID,U.USERNAME,U.PASSWORDHASH
    FROM  TBLUSERS U WHERE U.USERID =U.USERID 
    AND U.PASSWORDHASH=U.PASSWORDHASH) 
    then 'OLD PASSWORD EXISTS' 
    else 'OLD PASSWORD NOT EXISTS' 
    end as OUTPUT
    from DUAL;
    
    0 讨论(0)
  • 2020-12-23 03:56
    select NVL ((select 'Y' from  dual where exists
       (select  1 from sales where sales_type = 'Accessories')),'N') as rec_exists
    from dual
    

    1.Dual table will return 'Y' if record exists in sales_type table 2.Dual table will return null if no record exists in sales_type table and NVL will convert that to 'N'

    0 讨论(0)
提交回复
热议问题