根据SQL中另一个表的值更新不同的列
我有如下要求 我有一个表,所有字符都放在一列中,我需要使用这些信息创建一个表,每个字符有一列 例如: 源表:根据SQL中另一个表的值更新不同的列,sql,Sql,我有如下要求 我有一个表,所有字符都放在一列中,我需要使用这些信息创建一个表,每个字符有一列 例如: 源表: article id | char id | char value 1 | 1 | book 1 | 2 | yes 1 | 3 | 100 2 | 1 | cd 2 | 2 | No 目的地表 article id | type | l
article id | char id | char value
1 | 1 | book
1 | 2 | yes
1 | 3 | 100
2 | 1 | cd
2 | 2 | No
目的地表
article id | type | lendable | number of pages
1 | book | yes | 100
2 | cd | no | NULL
我们可以通过两个内部联接来实现这一点,但是如果有更多的列,那么我将很难做到。有没有一种直接的方法可以做到这一点
提前感谢您的帮助。只需使用
插入..选择即可
INSERT INTO destinationTable(articleid, type, lendable, NumberOfPages)
SELECT ArticleID,
MAX(CASE WHEN charID = 1 THEN charValue END) type,
MAX(CASE WHEN charID = 2 THEN charValue END) lendable,
MAX(CASE WHEN charID = 3 THEN charValue END) NumberOfPages
FROM SourceTable
GROUP BY ArticleID
与其构建一个“无所不能”的奇特查询,不如创建单独的小查询(每种类型的更新一个查询)更简单、更清晰
这样做有以下好处:
- 更好的维护—添加另一种新类型的自定义映射或更改现有映射很容易
- 它更加清晰易懂——清晰是良好编程的基石
- 测试要容易得多,因为您的更改集更小且更内聚
您可以使用透视或最大(值)…分组来“透视”您的表格,然后使用插入选择..或选择*插入…
with CTE_SourceTable
as
(
select article_id, [1] as type, [2] as lendable, [3] as [number of pages]
from SourceTable
pivot
(
max(char_value)
for char_id in ([1],[2],[3])
) as PVT
)
select *
into DestinationTable
from CTE_SourceTable
with CTE_SourceTable
as
(
select article_id, [1] as type, [2] as lendable, [3] as [number of pages]
from SourceTable
pivot
(
max(char_value)
for char_id in ([1],[2],[3])
) as PVT
)
select *
into DestinationTable
from CTE_SourceTable
你在用什么RDBMS
代表关系数据库管理系统RDBMS是SQL
的基础,也是所有现代数据库系统(如MS SQL Server、IBM DB2、Oracle、MySQL等)的基础。我想您指的是INSERT
而不是UPDATE
。