Thread: INSERT question

From:
sarlav kumar
Date:

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!
From:
Bruno Wolff III
Date:

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
;

From:
Tom Lane
Date:

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

From:
sarlav kumar
Date:

Thanks!! that worked!:)

Tom Lane <> 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

From:
george young
Date:

On Mon, 13 Dec 2004 08:28:39 -0800 (PST)
sarlav kumar <> 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)