Question

I have an insert command with values are calculated based on currency value on another table. Sql code is something like

INSERT INTO table1 (column1,column2,column3,column4,column5,column6)
VALUES
(
value1 * (SELECT currency FROM currency_table WHERE date=date1),
value2 * (SELECT currency FROM currency_table WHERE date=date1),
value3 * (SELECT currency FROM currency_table WHERE date=date1),
value4 * (SELECT currency FROM currency_table WHERE date=date2),
value5 * (SELECT currency FROM currency_table WHERE date=date2),
value6 * (SELECT currency FROM currency_table WHERE date=date2),
)

UPDATE table1 
SET column1 = value7 * (SELECT currency FROM currency_table WHERE date=date1),
column2 = value8 * (SELECT currency FROM currency_table WHERE date=date1),
column3 = value9 * (SELECT currency FROM currency_table WHERE date=date1),
column4 = value10 * (SELECT currency FROM currency_table WHERE date=date2),
column5 = value11 * (SELECT currency FROM currency_table WHERE date=date2),
column6 = value12 * (SELECT currency FROM currency_table WHERE date=date2)
WHERE column7 = value13

So i get currency values 3 times. Consider this is an example becaue my actual query has this with 10 calls.

How can i change this query to get Currency value not 3 times but only 1 time.

Consider currency_table has only 1 row.

Forgot to mention this query is for sql server 2008

Was it helpful?

Solution

Insert is ok with what Guneli has provided. Syntactically, the query is incorrect. Use

INSERT INTO table1 (column1,column2,column3,column4,column5,column6)
SELECT value1*currency1, value2*currency1, value3*currency1,
       value4*currency2, value5*currency2, value6*currency2
FROM (select (select currency from currency_table where date = @date1) currency1,
(select currency from currency_table where date = @date2) currency2) A;

For update, you can use the following command.

UPDATE t1 
SET t1.column1 = value1 * c.currency1,
t1.column2 = value2 * c.currency1,
t1.column3 = value3 * c.currency1,
t1.Column4 = value4 * c.currency2,
t1.column5 = value5 * c.currency2,
t1.column6 = value6 * c.currency2
from table1 t1, 
(select (select currency from currency_table where date = @date1) currency1, 
   (select currency from currency_table where date = @date2) currency2) C
WHERE t1.column4 = value4

It will make a cross join with currency_table, and assuming currency_table is having single row, it will update correctly.

OTHER TIPS

Try this for INSERT:

INSERT INTO table1 (column1,column2,column3)
VALUES
SELECT value1*currency, value2*currency, value3*currency
FROM currency_table;

What about a join? I am not sure on the condition as you select currency without any where clause.

UPDATE table1 t1 INNER JOIN currency_table c ON [condition??]
SET t1.column1 = value1 * c.currency,
t1.column2 = value2 * c.currency,
t1.column3 = value3 * c.currency,
WHERE t1.column4 = value4
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top