2012-05-22 85 views
2

我的任務是將數據從MSSQL服務器遷移到MySQL服務器。我認爲首先將MSSQL數據庫轉換爲MS Access數據庫會比較容易,所以我可以將其混淆,然後將其導出爲MySQL。在MS Access中將自己的行映射到自己的行

所以,我有一個表,名爲公司:

companyID | name  |  c_phon | c_email     | c_address 
    1  StackOverflow  5555555555  [email protected]  NYC 
    2  Google   5558675309  [email protected]   NYC 

在我們的新的數據庫,我們更改了這些字段被保存。而不是每行都有電話號碼,電子郵件和地址,我們正在使用一個優先表。

首選項:

prefID | prefName 
    1   c_phone 
    2   c_email 
    3   c_address 

我的問題是,如何將我的每個字段轉換成它自己排在我們companyPrefs表。它應該是這個樣子:

companyID | prefID | prefValue 
    1   1  5555555555 
    1   2  [email protected] 
    1   3  NYC 
    2   1  5558675309 
    2   2  [email protected] 
    2   3  NYC 

我不知道如何使用VBScript或什麼的,所以我試圖做到這一點使用SQL。

INSERT INTO comanyPrefs (companyID, prefID, prefValue) 
SELECT companyID, prefID, @fieldName 
FROM companies, preferences 
WHERE @fieldName = prefName 

顯然,這是行不通的。我如何使用可變字段名稱來選擇字段?我如何爲每個字段插入一行?

回答

2

你在正確的軌道上。但是,您將需要插入每個可能的領域,這樣的:

INSERT INTO companyPrefs (companyID, prefID, prefValue) 
SELECT companyID, (select prefID from prefs where prefName = 'c_phone'), c_phone 
FROM companies where c_phone is not null 
UNION 
SELECT companyID, (select prefID from prefs where prefName = 'c_email'), c_email 
FROM companies where c_email is not null 
UNION 
SELECT companyID, (select prefID from prefs where prefName = 'c_address'), c_address 
FROM companies where c_address is not null 

演示:http://www.sqlfiddle.com/#!3/5cf87/1

+0

我希望我不會有手動每個字段名稱添加到查詢。我希望我可以動態地做到這一點。 –

+0

那麼你可以從VBA動態構建代碼。例如,用一個字符串建立查詢,併爲每個字段名稱,例如例如,'strQuery = strQuery&「SELECT companyID ... where prefName ='」&theFieldName&「',」&theFieldName&「FROM其中」&theFieldName&「不爲空的公司。如果您的任何源列不是文本的,您也必須進行可能的轉換。 – mellamokb

+0

我不知道如何使用VB,我認爲這會花費比我手動輸入字段名稱更長的時間:-P –