基于变量的动态列上的SQL JOIN

时间:2013-10-09 17:31:10

标签: sql sql-server join vbscript vb6

我有一个图像汇总表[summary],它将在不久的将来用作报告表。有一个参考表[views]和第三个表,图像团队填充[TeamImage]。摘要表每个部件号有1行(表有不同的部件号)和许多图像视图列(TOP,BOT,FRO,BAC等)。 [views]表使用id字段列出每个视图,这是一个IDENTITY字段。 [TeamImage]表包含零件编号和视图(零件编号字段不唯一,因为零件编号将因图像视图而多次列出)。

示例:

    TABLE [summary]
Part_Number | TOP | BOT | FRO | BAC |
12345       |     |     |     |     |
67890       |     |     |     |     |

    TABLE [views]
id   | View |
1    | TOP  |
2    | BOT  |
3    | FRO  |
4    | BAC  |

    TABLE [TeamImage]
PartNum     | View |
12345       | TOP  |
12345       | BOT  |
12345       | FRO  |
12345       | BAC  |
67890       | FRO  |
67890       | BAC  |

这就是我最终需要的东西:

    TABLE [summary]
Part_Number | TOP | BOT | FRO | BAC |
12345       |  1  |  1  |  1  |  1  |
67890       |     |     |  1  |  1  |

我可以运行多个更新查询,但我有27个视图和大约200万个部件号。我希望我能运行类似下面的东西,即使我知道我不能使用变量作为列名:

DECLARE @id int = (SELECT max(id) FROM [views]), @ViewType nvarchar(3);

WHILE @id IS NOT NULL
BEGIN

    SELECT @ViewType = (SELECT [View] FROM [views] WHERE id = @id);

    UPDATE a
    SET a.[@ViewType] = '1'
    FROM [summary] a
    INNER JOIN [TeamImage] b
    AND a.[Part_Number] = b.[PartNum]

    WHERE b.[View] = @ViewType;

SELECT @id = max(id) FROM [views] WHERE id < @id;

END;

基本上,我希望使用变量从[views]表中获取不同的视图(id = 27到id = 1 ......可能已经计算但无关紧要)并填充相应的字段在[summary]表中。

我知道SET a。[@ ViewType] ='1'不起作用,我的同事提到使用VB但不知道这是否真的是最有效的选择。我知道我可以在[TeamImage]表上使用PIVOT,但我不确定是否允许我更新我的[summary]表(其中包含的字段多于图像视图)。我似乎仍然需要能够有效地循环更新查询的东西。我可以编写4个更新查询,每个视图一个(尽管我的真实表有27个视图),但是如果我们将来添加视图,我需要更动态的东西。

2 个答案:

答案 0 :(得分:1)

要创建最终摘要,您可以通过一个简单的数据透视表,但这已经修复了您已经完成的几个代码...但我知道SQL确实有一个PIVOT命令,但不是直接熟悉它。

select
      TA.PartNum,
      max( case when TA.TeamImage = 'TOP' then '1' else ' ' end ) as TOPview,
      max( case when TA.TeamImage = 'BOT' then '1' else ' ' end ) as BOTview,
      max( case when TA.TeamImage = 'FRO' then '1' else ' ' end ) as FROview,
      max( case when TA.TeamImage = 'BAC' then '1' else ' ' end ) as BACview
   from
      TeamImage TA
   group by
      TA.PartNum

显然很容易扩展,但你也可以查看“PIVOT”语法

答案 1 :(得分:0)

我在这里问了一点问题:SQL output as variable in VB.net并且能够得到一个适合我所寻找的答案。我很欣赏DRapp通过PIVOT提供解决方案,但我认为VB方式对我来说更容易。简而言之,使用VB与ExecuteScalar和ExecuteNonQuery,我能够使用上面的变量重新编写我的查询。