2016-05-26 10 views
0

古いデータベース設計から新しいデータベース設計にデータをコピーしようとしています。2つのテーブルのサブセットで交差結合

データベースはマルチテナントアプリケーション用であり、問​​題のソーステーブルはウィジェットカテゴリ名のテーブルです。

各テナントには、カテゴリ名の自分のプライベートのセットを持っているので、古いテーブルは次のようになります。

CREATE TABLE OldCategories (
    TenantId  bigint, 
    CategoryName nvarchar(255) 
) 

OldCategories: 
TenantId, CategoryName 
     1, 'Dog Toys' 
     1, 'Cat Toys' 
     1, 'Lizard Toys', 
     2, 'Dog Toys' 
     2, 'Duck Toys' 

新しいデータベースはテナントのカテゴリのすべての行ごとに複製されなければならないことを、このような中間テーブルを追加します中間テーブルには、ここに新しいスキーマは次のとおりです。

CREATE TABLE NewCategoryGroups (
    TenantId bigint, 
    GroupId bigint IDENTITY, 
    GroupName nvarchar(255) 
) 

CREATE TABLE NewCategories (
    GroupId  bigint, 
    CategoryName nvarchar(255) 
    CONSTRAINT PRIMARY KEY (GroupId, CategoryName) 
) 

ここNewCategoryGroupsテーブルには何があります:

NewCategoryGroups: 
TenantId, GroupId, GroupName 
     1,  1, '2006 Toys' 
     1,  2, '2010 Toys' 
     1,  3, '2016 Toys' 
     2,  4, '2007 Toys' 
     2,  5, '2010 Toys' 

そして、ここでは、私がNewCategoriesテーブルのために取得したいデータ例である:

NewCategories 
GroupId, CategoryName 
     1, 'Dog Toys' -- Groups 1 through 3 are for Tenant 1 
     1, 'Cat Toys' 
     1, 'Lizard Toys', 
     2, 'Dog Toys' 
     2, 'Cat Toys' 
     2, 'Lizard Toys', 
     3, 'Dog Toys' 
     3, 'Cat Toys' 
     3, 'Lizard Toys', 
     4, 'Dog Toys' -- Groups 4 and 5 are for Tenant 2 
     4, 'Duck Toys' 
     5, 'Dog Toys' 
     5, 'Duck Toys' 

私はそのままで、CROSS JOINを試してみた:これは失う除いて...

SELECT 
    CategoryName 
FROM 
    OldCategories 
    CROSS JOIN NewCategoryGroups 

TenantIdの区別は、すべてのテナントはすべての他のテナントのカテゴリを取得します。

+0

INNER JOINを使用する場合がありますか? –

+0

@FelixPamittan私の質問が更新されました – Dai

+0

データベースの設計がうまくいかず、各テーブルに主キーが必要です。 NewCategoriesのCategoryNameが重複しているのはなぜですか?これは、非正規化である - - 私はすぐにそれを正規化した場合には、別のFK参照を追加すると –

答えて

1

あなたは期待される結果となり何の代わり

SELECT 
    g.GroupId, 
    c.CategoryName 
FROM OldCategories c 
INNER JOIN NewCategoryGroups g 
    ON g.TenantId = c.TenantId 
関連する問題