对两组联接使用 Selected table
Using a Selected table for two sets of joins
我正在对存在于许多远程站点的一些旧 SQL table 进行合理化处理,因此我需要构建一个查询来生成新的 table坏旧的。因此,为此,我们有 table1
,其中 DataGroup
和 Case1
列为 nvarchar
,但这些是应用程序中的枚举,所以我创建了新的 tables 来存储枚举,但我需要获取 ID。不幸的是,我们需要将此 table 的所有枚举存储在单个 table 中,因此 ExData
table 包含 4 列:id
、name
、ExGroupId
和 DataGroupId
。
由于 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)
我正在对存在于许多远程站点的一些旧 SQL table 进行合理化处理,因此我需要构建一个查询来生成新的 table坏旧的。因此,为此,我们有 table1
,其中 DataGroup
和 Case1
列为 nvarchar
,但这些是应用程序中的枚举,所以我创建了新的 tables 来存储枚举,但我需要获取 ID。不幸的是,我们需要将此 table 的所有枚举存储在单个 table 中,因此 ExData
table 包含 4 列:id
、name
、ExGroupId
和 DataGroupId
。
由于 table1
中的 DataGroup
是文本,我们还需要从 kvp table DataGroupTable
这是我目前的查询:
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)