0

예약 (B_ID는 PK)곱하기 2 개 다른 테이블의 값과 새로운 테이블에 결과를 저장

| B_ID | Name | Unit_Price| 
|------+---------+-----------| 
| B01 | Math |  25 | 
| B02 | Science |  34 | 

주문 (O_ID이 PK가)

| O_ID | Date | Total_Price | 
|------+---------+-------------| 
| O01 | 12/1/16 | NULL  | 
| O02 | 20/3/16 | NULL  | 

주문 Detais (O_ID, B_ID는 복합 ID이며 두 ID는 위의 표와 FK입니다)

| O_ID | B_ID | Quantity | 
|------+------+-----------| 
| O01 | B01 |  2  | 
| O01 | B02 |  1  | 
| O02 | B02 |  5  | 

NULL을 계산 결과로 바꾸어 계산 방법을 Total_Price (Unit_Price * Quantity)에 삽입하는 방법. CTE를 사용하여 해결하려고했지만 새로운 레코드 (Exp : O03)가 추가 될 때 CTE를 다시 실행하여 업데이트해야하는 것을 좋아하지 않습니다. @Damien에 의해 주석에 이어

+1

계산 된 값을 저장하는 경우 저장되고 계산 된 값이 원본 기본 데이터와 일치하지 않을 가능성이 * 소개됩니다. 이상적으로, 필요에 따라 계산하여 (필요한 경우 로직을 뷰에 넣는) 성능이 부적절하다는 것이 입증 될 때까지 또는 그러한 값을 저장하지 마십시오. * 그런 다음 * 값을 저장하는 것을 고려하십시오. 그러나 가능한 경우 데이터베이스 시스템이 자동으로 값을 유지 보수하는지 확인하기 위해 메커니즘을 사용하십시오.이 값은 다시 계산해야한다는 것을 기억해야합니다. –

답변

0

, 당신이 계산 된 값을 저장하지하기로 결정한 경우, 다음 각 주문의 총 가격을 계산하기 위해 다음과 같은 쿼리를 사용하여 시도 할 수 있습니다 :

SELECT o.O_ID, 
     SUM(od.Quantity * b.Unit_Price) AS Total_Price 
FROM Order o 
LEFT JOIN Order_Details od 
    ON o.O_ID = od.O_ID 
LEFT JOIN Book b 
    ON od.B_ID = b.B_ID 
GROUP BY o.O_ID 
0

당신이에서이 colud 생각을 아이디어가 여기에서 나온 것입니다 :

create table book (b_id char(10),name char(20),Unit_Price int) 
create table orders(o_id char(10),Date varchar(10),Total_Price int) 
Create table Order_details(o_id char(10),b_id char(10),quantity int) 

insert into book values ('B01','Math' ,25); 
insert into book values ('B02','Science',34); 

INSERT INTO orders values ('O01','12/1/16',NULL)          
INSERT INTO orders values ('O02','20/3/16',NULL) 

Insert into order_details values('O01','B01',2); 
Insert into order_details values('O01','B02',1); 
Insert into order_details values('O02','B02',5); 




declare @total int, @o_id char(10) 

declare c cursor for 
select sum(a.unit_price * b.quantity),b.o_id from book a join order_details b on a.b_id=b.b_id group by b.o_id 
open c 
fetch next from c into @total,@o_id 
while @@FETCH_STATUS=0 
begin 
update orders set [email protected] where [email protected]_id 
fetch next from c into @total,@o_id 
end 
close c 
deallocate c 

select * from orders 
+0

order_details (Order_details 값 ('O02', 'B01', 1)에 삽입)에 새 레코드를 추가하려고했지만 계산 결과를 업데이트하지 않았습니다 (주문에서 * 선택). – Hidden

관련 문제