2017-11-03 115 views
2

我有一个事实和维度表缺少的行添加到结果集

create table #fact (SKey int, HT varchar(5), TitleId int) 

insert into #fact values 
(201707, 'HFI', 1), 
(201707, 'HFI', 3), 
(201707, 'HFI', 5), 
(201707, 'HFI', 6), 
(201707, 'REO', 1), 
(201707, 'REO', 2), 
(201707, 'REO', 4), 
(201707, 'REO', 5) 

create table #dim (TitleId int, Title varchar(10)) 
insert into #dim values 
(1, 'UK'), 
(2, 'AF'), 
(3, 'LQ'), 
(4, 'AL'), 
(5, 'GT'), 
(6, 'ML') 

使用下面的查询

select #fact.SKey, #fact.HT, #fact.TitleId, #dim.Title 
from #fact 
    inner join #dim on #dim.TitleId = #fact.TitleId 
order by #fact.SKey, #fact.HT, #fact.TitleId, #dim.Title 

返回我下面的数据

SKey HT TitleId Title 
-------- ----- --------- ------- 
    201707 HFI   1 UK  
    201707 HFI   3 LQ  
    201707 HFI   5 GT  
    201707 HFI   6 ML  
    201707 REO   1 UK  
    201707 REO   2 AF  
    201707 REO   4 AL  
    201707 REO   5 GT  

你看到有在结果中缺少标题。例如,第一组('HFI'组)没有'AF'和'AL','REO'部分没有'LQ'和'ML'。

总之我会产生以下结果

SKey HT TitleId Title 
-------- ----- --------- ------- 
    201707 HFI   1 UK  
    201707 HFI   2 AF  -- missing from first result 
    201707 HFI   3 LQ  
    201707 HFI   4 AL  -- missing from first result 
    201707 HFI   5 GT  
    201707 HFI   6 ML  
    201707 REO   1 UK  
    201707 REO   2 AF  
    201707 REO   3 LQ  -- missing from first result 
    201707 REO   4 AL  
    201707 REO   5 GT  
    201707 REO   6 ML  -- missing from first result 

目前,我的第一个结果存储到一个临时表,然后使用一个循环/光标缺少的行添加到INT。

有什么办法我们只使用一个查询来获得最终结果?

回答

0

可能是交叉联接像:

;with f as (
    select SKey, HT from fact 
    group by SKey, HT 
) 
select f.SKey, f.HT, dim.TitleId, dim.Title 
from f, dim; 

这里是sql fiddle

+1

有趣。谢谢。 – FLICKER

+1

为什么Ansi风格的连接不鼓励:http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx – TheGameiswar

-1

我想你想改变它到一个外部联接。

select #fact.SKey, #fact.HT, #fact.TitleId, #dim.Title 
from #fact 
    left join #dim on #dim.TitleId = #fact.TitleId 
order by #fact.SKey, #fact.HT, #fact.TitleId, #dim.Title 
+0

行仍将丢失。它没有在左表中开始的记录。 – Eric