Thread

  1. INSERT question

    Saranya Sivakumar <sarlavk@yahoo.com> — 2004-12-13T16:28:39Z

    Hi All,
     
    I have a question regarding multiple inserts.
    The following function inserts for each country found in country table, values into merchant_buyer_country.
     
    ----------------------------------------------------------------------------------------------------------------------------------------
            CSQLStatement st( sql );
            CSQLStatement st1( sql );
            SQLINTEGER rows;
            long num_codes = 0;
            rows = st.Select( "SELECT * FROM merchant_buyer_country where merchant_id = %lu ",merchant_id );
            if  ( rows )
                    return 0;
        char code[4];
            rows = st.Select( "SELECT code FROM country WHERE send IS NOT NULL OR receive IS NOT NULL" );
        SQLBindCol( st.hstmt, 1, SQL_C_CHAR, code, sizeof(code), 0 );
       long i;
       for (i = 0; i < rows; i++ )
       {
              st.Fetch();
              st1.Command("INSERT INTO merchant_buyer_country (merchant_id,country,enabled,group_id)  VALUES(%lu ,'%s', true, %lu )", merchant_id,
     code,group_id);
       }
            st.CloseCursor();
        st1.CloseCursor();
            return 1;
    ----------------------------------------------------------------------------------------------------------------------------------------
    
    On looking at the log file, I saw separate inserts being performed, and each insert takes about 1 second. 
     
    insert into merchant_buyer_country (merchant_id,country,enabled,group_id) values(1203,'IN','true',1);
    insert into merchant_buyer_country merchant_id,country,enabled,group_id)  values(1203,'US','true',1);
    insert into merchant_buyer_country merchant_id,country,enabled,group_id) values (1203,'AR','true',1);
    insert into merchant_buyer_country (merchant_id,country,enabled,group_id) values(1203,'AZ','true',1);
    insert into merchant_buyer_country merchant_id,country,enabled,group_id) values (1203,'BG','true',1);
    insert into merchant_buyer_country merchant_id,country,enabled,group_id) values(1203,'SP','true',1);
    .....
     
    
    
    
    
    
    There are more than 100 countries and this takes a lot of time for the inserts to complete. 
    Is there a way to write the INSERT as follows?
     
    INSERT into merchant_buyer_country (merchant_id,country,enabled,group_id)  values (1203, 
    (SELECT code FROM country WHERE send IS NOT NULL OR receive IS NOT NULL), 'true',1);
     
    I tried this, but I get the following problem:
    ERROR:  More than one tuple returned by a subselect used as an expression.
     
    I know there is a way to this, but I am not sure where I am going wrong. Can someone please help me figure this out.
     
    Thanks,
    Saranya
     
    
    		
    ---------------------------------
    Do you Yahoo!?
     Meet the all-new My Yahoo!  Try it today! 
  2. Re: INSERT question

    Tom Lane <tgl@sss.pgh.pa.us> — 2004-12-13T16:48:14Z

    sarlav kumar <sarlavk@yahoo.com> writes:
    > Is there a way to write the INSERT as follows?
     
    > INSERT into merchant_buyer_country (merchant_id,country,enabled,group_id)  values (1203, 
    > (SELECT code FROM country WHERE send IS NOT NULL OR receive IS NOT NULL), 'true',1);
     
    > I tried this, but I get the following problem:
    > ERROR:  More than one tuple returned by a subselect used as an expression.
    
    INSERT into merchant_buyer_country (merchant_id,country,enabled,group_id) 
      SELECT 1203, code, 'true', 1 FROM country
      WHERE send IS NOT NULL OR receive IS NOT NULL;
    
    			regards, tom lane
    
    
  3. Re: INSERT question

    Bruno Wolff III <bruno@wolff.to> — 2004-12-13T16:49:52Z

    On Mon, Dec 13, 2004 at 08:28:39 -0800,
      sarlav kumar <sarlavk@yahoo.com> wrote:
    > 
    > Is there a way to write the INSERT as follows?
    >  
    > INSERT into merchant_buyer_country (merchant_id,country,enabled,group_id)  values (1203, 
    > (SELECT code FROM country WHERE send IS NOT NULL OR receive IS NOT NULL), 'true',1);
    >  
    
    You have to use a SELECT instead of the VAlues clause. Something like the
    following should work:
    INSERT INTO merchant_buyer_country (merchant_id, country, enabled, group_id)
      SELECT 1203, code, TRUE, 1 FROM country
        WHERE send IS NOT NULL OR receive IS NOT NULL
    ;
    
    
  4. Re: INSERT question

    Saranya Sivakumar <sarlavk@yahoo.com> — 2004-12-13T18:31:13Z

    Thanks!! that worked!:)
    
    Tom Lane <tgl@sss.pgh.pa.us> wrote:sarlav kumar writes:
    > Is there a way to write the INSERT as follows?
    
    > INSERT into merchant_buyer_country (merchant_id,country,enabled,group_id) values (1203, 
    > (SELECT code FROM country WHERE send IS NOT NULL OR receive IS NOT NULL), 'true',1);
    
    > I tried this, but I get the following problem:
    > ERROR: More than one tuple returned by a subselect used as an expression.
    
    INSERT into merchant_buyer_country (merchant_id,country,enabled,group_id) 
    SELECT 1203, code, 'true', 1 FROM country
    WHERE send IS NOT NULL OR receive IS NOT NULL;
    
    regards, tom lane
    
    
    __________________________________________________
    Do You Yahoo!?
    Tired of spam?  Yahoo! Mail has the best spam protection around 
    http://mail.yahoo.com 
  5. Re: INSERT question

    Saranya Sivakumar <sarlavk@yahoo.com> — 2004-12-13T18:33:08Z

    Thanks guys!! that worked!:)
    
    Michael Adler <adler@pobox.com> wrote: 
    On Mon, Dec 13, 2004 at 08:28:39AM -0800, sarlav kumar wrote:
    > INSERT into merchant_buyer_country (merchant_id,country,enabled,group_id) values (1203, 
    > (SELECT code FROM country WHERE send IS NOT NULL OR receive IS NOT NULL), 'true',1);
    > 
    > I tried this, but I get the following problem:
    > ERROR: More than one tuple returned by a subselect used as an expression.
    
    INSERT into merchant_buyer_country (merchant_id,country,enabled,group_id) 
    SELECT 1203, code FROM country WHERE send IS NOT NULL OR receive IS NOT NULL;
    
    -Mike Adler
    
    Bruno Wolff III <bruno@wolff.to> wrote:
    On Mon, Dec 13, 2004 at 08:28:39 -0800,
    sarlav kumar wrote:
    > 
    > Is there a way to write the INSERT as follows?
    > 
    > INSERT into merchant_buyer_country (merchant_id,country,enabled,group_id) values (1203, 
    > (SELECT code FROM country WHERE send IS NOT NULL OR receive IS NOT NULL), 'true',1);
    > 
    
    You have to use a SELECT instead of the VAlues clause. Something like the
    following should work:
    INSERT INTO merchant_buyer_country (merchant_id, country, enabled, group_id)
    SELECT 1203, code, TRUE, 1 FROM country
    WHERE send IS NOT NULL OR receive IS NOT NULL
    ;
    
    ---------------------------(end of broadcast)---------------------------
    TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org
    
    		
    ---------------------------------
    Do you Yahoo!?
     All your favorites on one personal page  Try My Yahoo!
  6. Re: [PERFORM] INSERT question

    george young <gry@ll.mit.edu> — 2004-12-29T18:58:58Z

    On Mon, 13 Dec 2004 08:28:39 -0800 (PST)
    sarlav kumar <sarlavk@yahoo.com> threw this fish to the penguins:
    
    > Hi All,
    >  
    > I have a question regarding multiple inserts.
    > The following function inserts for each country found in country table, values into merchant_buyer_country.
    >  
    > -----------------------------------------------------------------------------------------------------------------------------------------
    >         CSQLStatement st( sql );
    >         CSQLStatement st1( sql );
    >         SQLINTEGER rows;
    >         long num_codes = 0;
    >         rows = st.Select( "SELECT * FROM merchant_buyer_country where merchant_id = %lu ",merchant_id );
    >         if  ( rows )
    >                 return 0;
    >     char code[4];
    >         rows = st.Select( "SELECT code FROM country WHERE send IS NOT NULL OR receive IS NOT NULL" );
    >     SQLBindCol( st.hstmt, 1, SQL_C_CHAR, code, sizeof(code), 0 );
    >    long i;
    >    for (i = 0; i < rows; i++ )
    >    {
    >           st.Fetch();
    >           st1.Command("INSERT INTO merchant_buyer_country (merchant_id,country,enabled,group_id)  VALUES(%lu ,'%s', true, %lu )", merchant_id,
    >  code,group_id);
    >    }
    >         st.CloseCursor();
    >     st1.CloseCursor();
    >         return 1;
    > -----------------------------------------------------------------------------------------------------------------------------------------
    > 
    > On looking at the log file, I saw separate inserts being performed, and each insert takes about 1 second. 
    >  
    > insert into merchant_buyer_country (merchant_id,country,enabled,group_id) values(1203,'IN','true',1);
    > insert into merchant_buyer_country merchant_id,country,enabled,group_id)  values(1203,'US','true',1);
    > insert into merchant_buyer_country merchant_id,country,enabled,group_id) values (1203,'AR','true',1);
    > insert into merchant_buyer_country (merchant_id,country,enabled,group_id) values(1203,'AZ','true',1);
    > insert into merchant_buyer_country merchant_id,country,enabled,group_id) values (1203,'BG','true',1);
    > insert into merchant_buyer_country merchant_id,country,enabled,group_id) values(1203,'SP','true',1);
    > .....
    >  
    > 
    > 
    > 
    > 
    > 
    > There are more than 100 countries and this takes a lot of time for the inserts to complete. 
    > Is there a way to write the INSERT as follows?
    >  
    > INSERT into merchant_buyer_country (merchant_id,country,enabled,group_id)  values (1203, 
    > (SELECT code FROM country WHERE send IS NOT NULL OR receive IS NOT NULL), 'true',1);
    >  
    > I tried this, but I get the following problem:
    > ERROR:  More than one tuple returned by a subselect used as an expression.
    >  
    > I know there is a way to this, but I am not sure where I am going wrong. Can someone please help me figure this out.
    
    Try:
    
    insert into merchant_buyer_country select 1203,code,true,1 from country where send is not null or receive is not null;
    
    -- George Young
    -- 
    "Are the gods not just?"  "Oh no, child.
    What would become of us if they were?" (CSL)