2016-04-23 60 views
0

我想设置一个事实表的ID与我的维度表相同。填充事实表SQL服务器

PRICE_TABLE    FACT_TABLE 
P_ID     P_ID 
1      0  
2      0 
3      0 
...      .... 

有没有人对此有一个好方法的建议?

UPDATE FACT_TABLE 
    SET FACT_TABLE.P_ID = PRICE_TABLE.P_ID 
    /* cannot seem to get a join here working */ 

我试过加入表格,但由于没有共同的价值,我似乎无法得到它的工作。

+1

有没有规定'FACT_TABLE'应该更新哪个记录,例如'P_ID = 1'而不是'P_ID = 2'? –

+0

唯一的约束是来自'PRICE_TABLE'的ID全部进入'FACT'并按顺序排列。到目前为止,我所拥有的第一个ID是来自'PRICE..'的第一个ID,它填充了'FACT'中的所有值。' – eggman

+0

'FACT_TABLE'中的哪个字段定义了顺序? –

回答

0

你可以使用ROW_NUMBER从这样的两个表中加入记录:

;WITH FACT_TABLE_RN AS (
    SELECT P_ID, 
      ROW_NUMBER() OVER (ORDER BY P_ID) AS rn 
    FROM FACT_TABLE 
), PRICE_TABLE_RN AS (
    SELECT P_ID, 
      ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn 
    FROM PRICE_TABLE 
) 
UPDATE ft 
SET P_ID = pt.P_ID 
FROM FACT_TABLE_RN AS ft 
JOIN PRICE_TABLE_RN AS pt ON pt.rn = ft.rn 
+0

感谢您提供这方面的信息,并对延迟回复表示歉意。我已经尝试过这种方法,但是它将所有事实表“P_ID”设置为价格表“P_ID”的第一条记录,因此所有记录都保留为1.有关为什么会发生这种情况的任何想法? – eggman

0

您可以使用更新的选择:

UPDATE ft 
SET ft.P_ID = pt.P_ID 
FROM FACT_TABLE ft 
LEFT JOIN PRICE_TABLE pt ON (pt.SomeField = ft.AnotherField) -- some join condition should be here 

也可以插入使用到选择,如:

TRUNCATE TABLE FACT_TABLE; -- it will remove all data from your table 
GO; 
INSERT INTO FACT_TABLE (P_ID, other fields...) 
SELECT P_ID, other fields FROM PRICE_TABLE 
0

目前,我可以向你提出这个建议。 我想我们可以找到没有临时表的另一种方法。 但现在应该做这项工作。

with prices as 
(
    select 
     id = row_number() over(), 
     P_ID 
    from PRICE_TABLE 
), 
facts as 
(
    select 
     id = row_number() over() 
     -- facts fieds you want 
    from FACT_TABLE 
) 
select 
    P_ID = prices.P_ID 
    -- facts fieds you want 
into #facts 
from facts 
    join prices on prices.id = facts.id 

delete FACT_TABLE 

insert FACT_TABLE 
(
    P_ID 
    -- facts fieds you want 
) 
select 
    P_ID 
    -- facts fieds you want 
from #facts 

drop table #facts 

您可能要取消对FACT_TABLE.P_ID约束,如果我没有理解很好地使用这个脚本


,你FACT_TABLE只包含您P_ID,这来自PRICE_TABLE。 为什么需要直接使用此FACT_TABLE而不是PRICE_TABLE? 为什么不使用insert/select创建FACT_TABLE而不是尝试更新FACT_TABLE的P_ID字段?