2009-08-25 46 views
0

我們進行了一個專有的程序,以前使用的Access的升級,現在採用SQL。表格模式完全相同,但問題是當我們切換到SQL時,主鍵重新啓動。我已經將舊的訪問數據庫導入到數據庫中的另一個sql表中。當前(基於SQL)表被命名爲Archive,導入的Access表爲ArchivePreSQL。我正在試圖做的是創建一個連接這兩個表的查詢(所以我有一個查詢中的所有記錄),並添加一個「S」的主鍵,如果從SQL表是和「A」,如果它是從導入的Access表中。是否有可能做到這一點?加入一個表與以前版本

我能得到這樣的數據的第一塊,但我不知道該如何與第二個表我如何渴望加入。

SELECT 'S' + CAST(ID爲varchar(MAX))AS身份證,戶口,BillingNumber,TakenTimestamp 從檔案

任何幫助,非常感謝!

回答

2

如果集不相交,只是UNION ALL他們:

SELECT 'S' + CAST(id AS varchar(MAX)) AS id, Account, BillingNumber, TakenTimestamp 
    FROM Archive 
    UNION ALL 
    SELECT 'A' + CAST(id AS varchar(MAX)) AS id, Account, BillingNumber, TakenTimestamp 
    FROM ArchivePreSQL 
+0

未格式化,但UNION ALL並沒有提供所需的列沒有第二個猜測的要求(我同意的結果列可能小於有用的,但我在評論說的話)。請注意,使用硬編碼的「S」和「A」,這些組不能相交。 – 2009-08-25 16:54:45

+0

'@ Philip':通過「集不相交的」我的意思是'Archive'不包含'ArchivePreSQL',我的數據。即這是一個完全新的表,而不是從'Access'進口填充使'SQL Server'新的數據表。 – Quassnoi 2009-08-25 17:01:59

1

我想你想使用UNION。與UNION的想法是,你有兩個(或更多)設置的SELECT的語句,兩者的預期與同類型都返回列完全相同的號碼,然後它們會連接在一起。

因此,例如:

SELECT 'S' + CAST(id AS varchar(MAX)) AS id, Account, BillingNumber, TakenTimestamp FROM Archive 
UNION SELECT 'A' + CAST(id AS varchar(MAX)) AS id, Account, BillingNumber, TakenTimestamp FROM ArchivePreSQL 
0

使用UNION關鍵字


SELECT 'S' + CAST(id AS varchar(MAX)) AS id, 
     Account, 
     BillingNumber, 
     TakenTimestamp 
FROM Archive 
UNION 
SELECT 'A' + CAST(id AS varchar(MAX)) AS id, 
     Account, 
     BillingNumber, 
     TakenTimestamp 
FROM ArchivePreSql 
1

是的,你可以做那可以通過聯盟來完成

SELECT 'S' + CAST(id AS varchar(MAX)) AS id, Account, BillingNumber, TakenTimestamp FROM Archive 
union 
SELECT 'A' + CAST(id AS varchar(MAX)) AS id, Account, BillingNumber, TakenTimestamp FROM ArchivePreSQL 

另一種選擇,將種子存檔標識符與說比ArchivePreSQL表的最高身份更高一些。假設你有在ArchivePreSQL 522行,然後種子存檔表在說1000然後,你知道,在1000以下的任何標識是在ArchivePreSql表,而不是存檔表。

另外,不要忘記您可以臨時禁用IdentityInsert功能並執行插入操作(包括標識符),然後重新啓用標識插入功能(這是生成自動遞增標識符字段的功能),以及將允許您完全擺脫ArchivePreSQL表。如果是需要知道的事情,然後你可以用標識插入種子值,使新項目始終高於設置金額復位夫婦這一點。

2
SELECT a.id, 
     'A', 
     a.account, 
     a.billingnumber, 
     a.takentimestamp 
    FROM ARCHIVE a 
UNION ALL 
SELECT b.id, 
     'B', 
     b.account, 
     b.billingnumber, 
     b.takentimestamp 
    FROM ARCHIVEPRESQL b 
ORDER BY id 

我不建議在ID前面加上前綴,因爲那樣你就無法按順序排序。

+0

+1只是爲了你爲什麼要命令由ID格式化你的代碼 – 2009-08-25 15:50:29

+0

?他們通常不能保證以任何特定的順序,只有唯一的 – 2009-08-25 16:03:49

+0

然後,通過閱讀第二列,將明顯看到重複或奇怪的地方。處理孤立事件也比較容易,而不必爲了測試任意值的存在而使用子串。 – 2009-08-25 16:13:47