2016-10-05 12 views
2

私は前年のデータベースからデータを取得する必要がある状況に就いています。 私はこのデータベースを持っている:他のデータベースからデータを取得

Manila2016 
Manila2015 
Manila2014 
Manila2013 
Manila2012 
California2016 
California2015 
California2014 

我々はすべてのブランチ内のすべてのビジネスや給与トランザクションを記録VB.netで行われた集中管理システムを持っています。

従業員のATMのリリースを記録するテーブルがあります。 問題は、従業員のATMが2015年にリリースされた場合(Manila2015)、レコードはManila2015データベースに残ります。これは前年と同じプロセスです。

ここで使用しているのはManila2016データベースです。従業員がすでにManila2015またはManila2014、Manila2013などでATMを取得しているかどうかを確認する必要があります。

すべてのデータベースに参加することができますが、私が言ったように、システムは集中化されており、割り当てられている支店に応じてデータベースが使用されます。カリフォルニア支店は3つのデータベースしか持っていないので、従業員ATMデータの検索を開始する前に、支店に基づいてすべてのデータベースをループする必要があると思います。これは私のコードでは、従業員のATMは、すでに現在の年にリリースされた場合にのみチェックVB.netでどのように見えるかです

RecordNo - int 
EmployeeID - nvarchar 
Name - nvarchar 
Position -nvarchar 
ATM -bit 
ATMreleasedDate -smalldatetime 
Status - nvarchar 

これは、テーブルの構造は次のようになります。

Dim Year as string = '2016' 
Dim Branch as string = 'Manila' 
Dim EmployeeID as string = '10087654321-MNL' 

sql = <string>  
SELECT 
EmployeeID, 
Name, 
Position, 
CASE When ATM IS NULL THEN 'NO' ELSE 'YES' END [ATM], 
ATMrelasedDate, 
Status 
FROM <%= Branch %><%= Year %> WHERE EmployeeID = '<%= EmployeeID %>' 
<string> 
ExecuteSQLQuery(sql) 
+0

"データベースの構造"について説明したので、私は異なるテーブルではなく、異なるデータベースを意味すると思います。私はあなたが達成しようとしているものが変数(分岐識別子)を必要としていると推測しています。そして、分岐に基づいて特定のテーブルから選択します。 – ZLK

答えて

0

UNIONビューを作成すると、必要な各テーブルが参照されます。ブランチと年を含むビューの各要素に静的な列を追加します。このビューは毎年更新する必要があります(または、事前にテーブルを作成することもできます)。

実際には、ブランチと年を別々の列として持つ単一のテーブルを作成し、各ブランチのビューを導入する方がよいでしょう。これはデザインの重要な部分です。

したがって、変更:RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status 〜:Branch, Year, RecordNo, ...

SQLでは、ほとんどの場合、テーブル名よりもデータを列に配置する方が簡単です。

+0

しかし、私はテーブルを変更することはできません。私たちはこのテーブル構造を何年も使っています。 –

+0

最初の選択肢は、既存のスキーマを変更する必要はありません。これにより、既存のアプリケーションを変更せずに、@SQLDBAで説明されているように単一の構造をクエリできます。これはまた、毎年の変更が必要です。パフォーマンスが引き続き懸念される場合は、マテリアライズド・ビューを使用してください。私はまだ、単一のテーブルでデザインを長期的に1つに変更することを検討したいと思います。これにより、より良い成長が可能になります。 – Pekka

1

@Pekkaに同意します。 UNIONビューを作成するだけです。これは既存のテーブルには影響しません。

CREATE VIEW vwAllBranches AS 

    SELECT "Manila2016" AS Branch, RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status 
    FROM Manila2016 
    UNION 
    SELECT "Manila2015" AS Branch, RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status 
    FROM Manila2015 
    UNION 
    SELECT "Manila2014" AS Branch, RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status 
    FROM Manila2014 
    UNION ALL 
    SELECT "Manila2013" AS Branch, RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status 
    FROM Manila2013 
    UNION 
    SELECT "Manila2012" AS Branch, RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status 
    FROM Manila2012 
    UNION 
    SELECT "California2016" AS Branch, RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status 
    FROM California2016 
    UNION ALL 
    SELECT "California2015" AS Branch, RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status 
    FROM California2015 
    UNION 
    SELECT "California2014" AS Branch, RecordNo, EmployeeID, Name, Position, ATM, ATMreleasedDate, Status 
    FROM California2014 

次に、SELECT * FROM vwAllBranchesを実行してデータを取得することができます。しかし、いくつかの事柄...

1)ビューにインデックスを作成することを検討する必要があります。

2)SQLインジェクションを制限するには、ストアドプロシージャまたはパラメータ化クエリを使用する必要があります。

+0

ええ、私の問題は、Manila2016、Manila2015などのようにコード化するだけではありません。私はブランチに基づいてデータベース名をキャプチャしています。ブランチはマニラとカリフォルニアだけではありません。 10の場所には、多くのコードと時間がかかります。とにかく、私はすべてのブランチのデータベースをループすることができますか?たとえば、私の支店がマニラの場合、私はすべてのマニラのデータベースを検索します。また、そのクエリを使用することで、2017年と2018年に再びソースコードを編集する必要があります。 –

関連する問題