【发布时间】:2021-09-29 14:13:31
【问题描述】:
我有一个非常复杂的查询,它已经从近 10 个表中提取数据并且还在增长,我需要实现一些不寻常的事情。主表(FROM 表)有一个名为 SIZEPOS 的字段,它是一个从 1 到 25 的索引号。别名为 siz 的连接表具有与主表相应的连接字段(一些外部 ID) ,还有字段,如SIZE1、SIZE2、...、SIZE25,其中每个字段都保存一个大小值,即SIZE1 可能保存值6、SIZE2 值8 等。 .
所以我想要在我的查询中包含该连接表的特定 SIZE+[SIZEPOS] 字段。换句话说,如果 SIZEPOS 持有特定产品的值 3,我只想从所有 SIZE1、SIZE2、SIZE3、SIZE4 等中获取字段 siz.SIZE3。 .
我把情况简化得够多了,居然可以给你准备一把小提琴!所以我需要实现的是为SELECT查询的每一行包含适当的SIZE{\d}字段,而不是我使用的硬编码SIZE1......根据我的阅读,这个概念被称为动态列,并且需要一个变量和一个EXEC 命令,但我在 SQL Server 方面的知识还处于起步阶段,所以它完全超出了我的能力......
SELECT sub.ITEID, sub.SUBSTITUTECODE, prod.MAINSZLID, sub.SIZEPOS, siz.SIZE1
FROM @SUBSTITUTE AS sub
INNER JOIN @MATERIAL AS prod ON prod.ID = sub.ITEID
INNER JOIN @SIZELIST AS siz ON siz.CODEID = prod.MAINSZLID;
小提琴可以找到here
【问题讨论】:
-
这可以使用动态 SQL(或者可能是 UNPIVOT)来完成,但复杂性的根本原因是数据库模型。重复列违反了第一范式数据库设计。最好将列存储为行分隔行。
-
我无法控制数据库设计。我的任务只是在此桌面应用程序和电子商务网站之间架起一座桥梁……此外,我知道解决我的问题的概念称为动态列……这就是我所知道的一切!呵呵!你能提供一些我可以用于我的情况的代码吗?
标签: sql-server tsql dynamic-columns