2012-12-17 2 views
1

여러 테이블의 여러 레코드가 있습니다. 그 레코드를 나중에 전달할 임시 테이블에 삽입해야합니다. 문제는 내가 열 테이블에 삽입 할 때 모든 행 행 ID 카운터가 증가 할 때 데이터 행을 현명하게 삽입한다는 것입니다. 나는 현명한 데이터 열을 삽입해야합니다. 모든 열에 대한 의미 (diff 테이블에서 레코드를 가져옴) rowId 카운터는 1.if부터 시작합니다. 첫 번째 열에 데이터를 삽입합니다. 행 ID 카운터는 1-5입니다 (5 행이있는 경우). 내가 두 번째 진술 (2 열)에 대한 데이터를 실행하면 임시 테이블에 행 ID 6.에서 데이터가 삽입되고 나머지 (1-5)는 Null 값입니다. 해결책이 있습니까? 도와주세요. 모든 단서는 상당합니다. 미리 감사드립니다! 아래 내 절차는 ...임시 테이블에 여러 테이블 데이터 삽입

alter PROCEDURE procGetPreviousOrderDetails --(@userid nvarchar(100)) 

AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

declare @recentViewedProduct nvarchar(max) 
declare @AccountCreatedDate nvarchar(100) 
declare @recentViewedCategories nvarchar(max) 
declare @recentOrderProductList nvarchar(max) 
declare @dateOflastPurchase nvarchar(max) 
declare @shippingMethodList nvarchar(max) 
declare @paymentMethodList nvarchar(max) 
declare @totalOrderAmount nvarchar(100) 
declare @zipCode nvarchar(100) 

declare @tblOrderDetails table 
(
    RowId int identity(1,1), 
    recentViewedProduct nvarchar(max), 
    trailType int, 
    AccountCreatedDate nvarchar(100), 
    recentViewedCategories nvarchar(max), 
    recentOrderProductList nvarchar(max), 
    dateOflastPurchase nvarchar(max), 
    shippingMethodList nvarchar(max), 
    paymentMethodList nvarchar(max), 
    totalOrderAmount nvarchar(100), 
    zipCode nvarchar(100) 

) 

if (select count(@@rowcount) from @tblOrderDetails) > 0 
begin      
    truncate table tblOrderDetails 
end 



insert into @tblOrderDetails(recentViewedProduct) select RV.item_name, RV.trail_type from tblCMRecentlyViewed RV where RV.trail_type in (1, 2) and RV.user_id = '807CF717-9413-4CC3-8982-FF63A6B31906' order by RV.date_added desc 
insert into @tblOrderDetails(AccountCreatedDate) select d_date_registered from UserObject where g_user_id = '807CF717-9413-4CC3-8982-FF63A6B31906' 
    select distinct product_id from OrderFormLineItems where ordergroup_id = (select TOP 1 ordergroup_id from Ordergroup where user_id='807CF717-9413-4CC3-8982-FF63A6B31906' 
order by order_create_date desc) 
select TOP 1 order_create_date from Ordergroup where user_id='807CF717-9413-4CC3-8982-FF63A6B31906' order by order_create_date desc 
select distinct display_name from ShipMethods where carrier_ship_method_id = (select distinct ship_method_id from Ordergroup where user_id='328239F8-A983-442C-A9E6-ADC203D5F52B') 
select distinct saved_payment_type from OrderFormHeader where ordergroup_id in (select distinct ordergroup_id from Ordergroup where user_id='328239F8-A983-442C-A9E6-ADC203D5F52B') 
select SUM(saved_cy_total_total) from Ordergroup where user_id='807CF717-9413-4CC3-8982-FF63A6B31906' 
select distinct u_postal_code from Addresses where g_id = '807CF717-9413-4CC3-8982-FF63A6B31906' 

감사합니다!

답변

1

나는 이것이 잘못된 길로 가고 있다고 말하고 싶습니다. 이러한 각 쿼리는 자체적으로 프로 시저 여야합니다. 데이터 병합은 비즈니스 로직의 책임이어야합니다.

AccountCreatedDate, DateOfLastPurchase 및 TotalOrderAmmount를 하나의 프로 시저로 반환하는 것을 고려해야합니다.이 프로 시저는 한 행에만 있고 나머지는 고유 한 프로 시저를 가져야하기 때문입니다.

정말로이 작업을 수행하려면 각 하위 선택에서 LEFT JOIN을 수행하고 모든 쿼리를 단일 쿼리에서 수행해야합니다. 그러나 성능이 저하됩니다

insert into @tblOrderDetails 
select u.user_id, u.g_date_registered 
from UserObject u 
left join RV on u.user_id = RV.user_id 
    and RV.trail_type in (1, 2) 
left join (
    select user_id, product_id 
    from OrderFormLineItems 
    where ordergroup_id = (
     select TOP 1 ordergroup_id 
     from Ordergroup 
     where user_id='807CF717-9413-4CC3-8982-FF63A6B31906') 
    ) ofli on ofli.user_id = u.user_id 
left join (
    select TOP 1 user_id, order_create_date 
    from Ordergroup 
    where user_id='807CF717-9413-4CC3-8982-FF63A6B31906' 
    order by order_create_date desc 
    ) og on og.user_id = u.user_id 
left join (
    select distinct user_id, display_name 
    from ShipMethods 
    where carrier_ship_method_id = (
     select distinct ship_method_id 
     from Ordergroup 
     where user_id='328239F8-A983-442C-A9E6-ADC203D5F52B') 
    ) sm on sm.user_id = u.user_id 
-- etc ... 
where u.user_id = '328239F8-A983-442C-A9E6-ADC203D5F52B' 
1

를 첫 번째 INSERT에 행을 삽입 한 후에는 행에 다른 열을 변경하는 행을 업데이트해야합니다. 즉, UPDATES를 정확하게 적용 할 수 있도록 임시 테이블에 각 행에 대한 관련 식별 정보가 있어야합니다.

또는 Patrik Melander가 제안한대로 SELECT 문을 하나로 결합하십시오. 이는 완전한 레코드 만 INSERT한다는 것을 의미합니다.

두 가지 메커니즘으로 인해 문제가 발생하지 않습니다.

관련 문제