質問

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

役に立ちましたか?

解決

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.

他のヒント

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top