根据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