2009-08-25 15 views
0

以前はAccessを使用していたプロプライエタリ・プログラムのアップグレードを行い、現在はSQLを使用しています。テーブルのスキーマはまったく同じですが、問題は、SQLに切り替えたときに主キーが再開されたことです。古いアクセスデータベースをデータベースの別のSQLテーブルにインポートしました。現在の(SQLベースの)テーブルの名前はArchiveで、インポートされたAccessのテーブルはArchivePreSQLです。私がしようとしているのは、これらの2つのテーブルを結合するクエリを作成して(つまり、すべてのレコードを1つのクエリで持つように)、SQLテーブルの場合はプライマリキーに "S"を追加し、インポートされたAccessテーブルから削除します。これは可能ですか?以前のバージョンのテーブルへの結合

私はこれのようなデータの最初のチャンクを得ることができますが、私はどのように2番目のテーブルでそれを私が望む方法で結合するのか分かりません。

は、SELECT 'S' + CAST(idはVARCHAR(MAX)AS)アーカイブ

からID AS、アカウント、BillingNumber、TakenTimestamp これですべてのヘルプははるかに高く評価されます!

答えて

2

を使用します。

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"では、セットが交差できないことに注意してください。 –

+0

'@ Philip':by" intersects not intersect "私は' Archive'に 'ArchivePreSQL'からのデータが含まれていないことを意味しました。 e。これはまったく新しいテーブルであり、 'Access'からインポートされたテーブルではなく、' SQL Server'によって新しいデータで満たされたテーブルです。 – Quassnoi

1

私はあなたがUNIONを使いたいと思います。 UNIONのアイデアは、SELECTステートメントの2つ(またはそれ以上)のセットを持っており、どちらもそれぞれ同じタイプの同じ正確な数のカラムを返すことが予想され、それらは一緒に連結されます。例えばので

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 ALLそれら、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 

もう1つの方法として、ARCHIVE識別子を、ArchivePreSQLテーブルの最高のIDよりも高い数字で設定することもできます。 ArchivePreSQLに522行があり、次に1000というARCHIVEテーブルを作成したとします。1000より下の識別子は、Archiveテーブルではなく、ArchivePreSqlテーブルにあることがわかります。

また、IdentityInsert機能を一時的に無効にして(識別子を含む)挿入を実行し、Identity Insert機能(自動インクリメントIDフィールドを生成する機能)を再度有効にすることができます。 ArchivePreSQLテーブルを完全に削除することができます。知っておく必要がある場合は、Identity Insertのシード値をリセットして新しいアイテムが常に設定された量を超えるようにすることができます。

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あなたのコードをフォーマットするだけです –

+0

IDで注文するのはなぜですか?彼らは一般的に、特定の順序になることは保証されておらず、ただ一意です –

+0

次に、2番目の列を読み取って重複または奇妙な部分があることが明らかになります。また、任意の値の存在をテストするために部分文字列を使用するのではなく、単離することに対処する方が簡単です。 –

関連する問題