交叉加入2个表的子集

时间:2016-05-26 05:21:33

标签: sql

我正在尝试将数据从旧的数据库设计复制到新的数据库设计。

该数据库用于多租户应用程序,所讨论的源表是一个窗口小部件类别名称表。

每个租户都有自己的私有类别名称,因此旧表格如下所示:

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的区别,所以每个租户都会获得其他所有租户的类别。

1 个答案:

答案 0 :(得分:1)

您可能希望使用INNER JOIN代替

SELECT
    g.GroupId,
    c.CategoryName
FROM OldCategories c
INNER JOIN NewCategoryGroups g
    ON g.TenantId = c.TenantId