对两组联接使用 Selected table

Using a Selected table for two sets of joins

我正在对存在于许多远程站点的一些旧 SQL table 进行合理化处理,因此我需要构建一个查询来生成新的 table坏旧的。因此,为此,我们有 table1,其中 DataGroupCase1 列为 nvarchar,但这些是应用程序中的枚举,所以我创建了新的 tables 来存储枚举,但我需要获取 ID。不幸的是,我们需要将此 table 的所有枚举存储在单个 table 中,因此 ExData table 包含 4 列:idnameExGroupIdDataGroupId

由于 table1 中的 DataGroup 是文本,我们还需要从 kvp table DataGroupTable

中查找 int id

这是我目前的查询:

SELECT
    <Other Columns>,
    t1.ExDataId AS Case1
FROM
    table1
    LEFT JOIN (
        SELECT
            DataGroupTable.name AS dataGroup,
            ExData.id AS ExDataId,
            ExData.name AS ExDataName,
            ExGroup.name AS ExGroupName
        FROM
            ExData
            LEFT JOIN DataGroupTable ON DataGroupTable.id = ExData.dataGroupId
            LEFT JOIN ExGroup ON ExGroup.id = ExData.ExGroupId
    ) t1 ON t1.dataGroup = table1.DataGroup
    AND t1.ExGroupName = 'case1'
    AND t1.ExDataName = table1.Case1
GO

... 但是,虽然这可以检索 Case1,但我将如何获取 Case2? 我有 7 个案例要处理,虽然我可以通过自由复制粘贴来解决这个问题,但这远非优雅。

此外,这一切都将进入 INSERT 语句,因此理想情况下,这应该 return Case1、Case2 等作为 ExDataId 的

请帮忙。

请求的示例数据,所有 id 将从 0 开始,但为了清楚起见,我将以下所有内容设为唯一。

table1:

DataGroup   Case1   Case2   Case3   <Other Columns>
ABCD        bob     bob    chris   1
ABCD        pete    gary    chris   2
EFGH        bob     mike    rod     3

数据组表:

id   name
11    ABCD
12    EFGH

前组:

id   name
21    case1
22    case2
23    case3

ExData:

id   name   ExGroupId   dataGroupId
31    bob    21          11
32    pete   21          11
33    bob    21          12
34    bob    22          11
35    gary   22          11
36    mike   22          12
37    chris  23          11
38    rod    23          12

理想结果:

<Other Columns>   Case1   Case2   Case3
1                 31      34      37
2                 32      35      38
3                 33      36      38

常见的 Table 表达式怎么样?

WITH ExDataCTE AS (
    SELECT
        DataGroupTable.name AS dataGroup,
        ExData.id AS ExDataId,
        ExData.name AS ExDataName,
        ExGroup.name AS ExGroupName
    FROM
        ExData
        LEFT JOIN DataGroupTable ON DataGroupTable.id = ExData.dataGroupId
        LEFT JOIN ExGroup ON ExGroup.id = ExData.ExGroupId)
SELECT
    <Other Columns>,
    t1.ExDataId AS Case1,
    t2.ExDataId AS Case2,
    t3.ExDataId AS Case3
FROM
    table1
    LEFT JOIN ExDataCTE t1 ON (t1.dataGroup = table1.DataGroup 
                           AND t1.ExGroupName = 'case1'
                           AND t1.ExDataName = table1.Case1)
    LEFT JOIN ExDataCTE t2 ON (t2.dataGroup = table1.DataGroup 
                           AND t2.ExGroupName = 'case2'
                           AND t2.ExDataName = table1.Case2)
    LEFT JOIN ExDataCTE t3 ON (t3.dataGroup = table1.DataGroup 
                           AND t3.ExGroupName = 'case3'
                           AND t3.ExDataName = table1.Case3)