2016-04-23 99 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字段?