【发布时间】:2021-09-03 12:43:38
【问题描述】:
我的数据库中有两个表存在以下问题:
COMMENT表
KEY
TYPE
NUMBER
TEXT
由(KEY, TYPE, NUMBER)组成的复合键
RESULTS表
KEY
TYPE1
TYPE2
...
TYPE20
TEXT1
TEXT2
...
TEXT20
COMMENT 表的示例如下:
KEY | TYPE | NUMBER | TEXT|
1 A 0001 SAMPLETEXT
1 A 0002 SAMPLETEXT2
1 B 0001 SAMPLETEXT3
1 B 0002 SAMPLETEXT4
1 B 0003 SAMPLETEXT5
2 C 0001 SAMPLETEXT6
2 C 0002 SAMPLETEXT7
3 A 0001 SAMPLETEXT8
对于每个 KEY,只有 3 种不同的类型 A,B,C,而一个 TYPE 在 NUMBER 字段中最多可以有 0020。这些记录按 KEY 然后按 TYPE
我需要完成以下操作:对于 COMMENT 表中的每个 KEY,将前 20 TYPE 行插入到 de RESULTS 表内的每一列中(TYPE1 Comment 表中的第一种类型,TYPE2 用于注释表中的第二种类型,依此类推)并将前 20 个 TEXT 行插入 RESULTS 表中的每一列(TEXT1 用于第一个文本,TEXT2 用于第二个文本等等)
RESULTS 表如下所示:
KEY | TYPE1 | TYPE2 | TYPE3 | ... | TYPE20 | TEXT1 | TEXT2 | ... | TEXT20
1 A A B NULL SAMPTE1 SAMPTE2 NULL
2 C C NULL NULL SAMPTE6 SAMPTE7 NULL
3 A NULL NULL ... NULL SAMPTE7 NULL .... NULL
RESULTS 表的每个 KEY 都有一行,最多 20 个 TEXT 字段及其对应的类型。
如您所见,这个RESULTS 表显然设计不佳。它是 70 年代制作的,我们无法更改。
实施时可能会出现一些问题,以下是答案:
- 如果一个KEY在
COMMENT表中有超过20个TEXT怎么办?我们不在乎,我们只插入前 20 个 - 例如,如果我有 23 个 A 类文本和 10 个 B 类文本怎么办?然后只有前 20 个 A 型文本会出现在
RESULTS - 有什么办法可以更改
RESULTS表吗?很遗憾,没有。 -
TYPE1是否匹配
RESULTS表中的TEXT1,TYPE2是否匹配TEXT2等等?是的,匹配的列数也是一样的。 - 如果
COMMENT表中的TEXT少于20个,RESULTS中TEXT和TYPE的其余值是否为空?是的
问题是,什么是最简洁、最快、可扩展、不乏味的实现方式?
另外,如何实现它,以便将来 RESULTS 表可以有 N 更多 TYPE 列和 N 更多 TEXT 列?
我听说过使用 PIVOT 表、连接和许多其他技术,但我不知道如何实现。
【问题讨论】:
-
嗨,也许你可以pivot
-
您没有解决的一个问题是为什么要在 SQL 中执行此操作。这是一个清晰的 SQL 反模式/代码气味。如果是为了演示,在数据库中做这个是错误的位置,如果是为了进一步的SQL处理或存储,这是一个糟糕的结构; SQL(语言)和 RDBMS 都是为您开始使用的结构明确设计的。
标签: sql join sql-server-2012 pivot exists