2015-08-09 40 views
0

我想只將這些記錄插入到#AltDealNames表中,其中DealName存在於#DistDeal表中但不在#AltDealNames表中。爲此,我試圖不存在條款。但它沒有按預期工作。查詢只是將記錄轉儲到#AltDealNames表中。需要澄清哪裏不存在條款

insert into #AltDealNames 
select d.DealName, d.ManagerScrubbed, d.BbgDealName, t.TrancheName, t.StreetCusip, t.ISIN, t.BbgTrancheName 
from metric..Deal d join metric..Tranche t on d.DealName = t.DealName 
where not exists(select 1 from #DistDeal dd join #AltDealNames ad on ad.DealName = dd.DealName) 

請幫助我知道如果我在構建查詢時做錯了什麼。

回答

0

如果我理解正確的,你想要一個exists子句#DistDeal#AltDealNames一個not exists

insert into #AltDealNames 
    select d.DealName, d.ManagerScrubbed, d.BbgDealName, t.TrancheName, 
      t.StreetCusip, t.ISIN, t.BbgTrancheName 
    from metric..Deal d join 
     metric..Tranche t 
     on d.DealName = t.DealName 
    where exists (select 1 from #DistDeal dd where dd.DealName = d.DealName) and 
      not exists (select 1 from #AltDealNames ad on ad.DealName = dd.DealName); 

注:使用insert時,你應該總是包括列名的列表。

+0

戈登感謝您的回覆,但可能是我的誤解,認爲其中不存在條款適用於記錄以記錄爲基礎,如果插入第一條記錄,如果它不存在,則第二條和第三條。但是看起來where不存在的子句將在外部查詢的完整結果集上工作。 –

+0

@ShashiShankar。 。 。 'select'在'insert'之前完全評估。 –

0

根據優化器設置實際物理查詢的方式,在此查詢插入任何內容之前,「where not exists」子句可能首先運行。也就是說,它只會過濾來自先前查詢的#AltDealNames中的值。

如果你想避免將那些在#DistDeal DealName值,那麼也許你想:

insert into #AltDealNames 
select d.DealName, d.ManagerScrubbed, d.BbgDealName, t.TrancheName, 
    t.StreetCusip, t.ISIN, t.BbgTrancheName 
from metric..Deal d 
    join metric..Tranche t on d.DealName = t.DealName 
where not exists(select 1 from #DistDeal dd 
      where d.DealName = dd.DealName) -- Changed line