1

複数のテーブルから複数のレコードがあります。そのレコードを一時テーブルに挿入する必要があります。このテーブルは後で渡します。問題は、一時テーブルに行を挿入すると、列の行IDカウンターごとにデータ行ごとの平均が増加することです。データを列ごとに挿入する必要があります。すべての列(diffテーブルからレコードをフェッチする場合)の平均rowIdカウンターは1から始まります。最初の列にデータを挿入すると、行IDカウンターは1〜5になります(5行ある場合)。2番目のステートメント(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'   

ありがとう!

4

2 に答える 2

1

最初の INSERT で行を挿入した後、行の他の列を変更するには、行を更新する必要があります。つまり、UPDATES を正確に適用できるように、一時テーブルには各行に関連する識別情報が含まれている必要があります。

または、Patrik Melander の提案に従って、SELECT ステートメントを 1 つに結合します。これは、完全なレコードのみを挿入することを意味します。

どちらのメカニズムも、遭遇している問題を回避します。

于 2012-12-19T15:36:50.980 に答える
1

あなたはこれについて間違った方向に進んでいると言えます。これらのクエリはそれぞれ、それ自体がプロシージャである必要があります。データのマージは、ビジネス ロジックが担当する必要があります。

AccountCreatedDate、DateOfLastPurchase、および TotalOrderAmmount を 1 つのプロシージャで返すことを検討する必要があります。これは、1 つの行のみであり、残りは独自のプロシージャを持つ必要があるためです。

本当にこれを行いたい場合は、各サブ選択で 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'
于 2012-12-17T08:42:27.897 に答える