Sql 使用另一个表中的一列更新一个表中的多列
我有三个以这种格式构建的表:Sql 使用另一个表中的一列更新一个表中的多列,sql,sql-server,sql-server-2008,tsql,sql-update,Sql,Sql Server,Sql Server 2008,Tsql,Sql Update,我有三个以这种格式构建的表: DECLARE @A ( TypeName varchar(100), Type1 varchar(3), Type2 varchar(3), Type3 varchar(3), Type4 varchar(3), Type5 varchar(3), Type6 varchar(3) ) Data: | Bob | null | null | null | null | null | null | | S
DECLARE @A
(
TypeName varchar(100),
Type1 varchar(3),
Type2 varchar(3),
Type3 varchar(3),
Type4 varchar(3),
Type5 varchar(3),
Type6 varchar(3)
)
Data:
| Bob | null | null | null | null | null | null |
| Steve | null | null | null | null | null | null |
| Bill | null | null | null | null | null | null |
...
DECLARE @B
(
NameID int,
Name varchar(100)
)
Data:
| 1 | Bob |
| 2 | Steve |
| 3 | Bill |
...
DECLARE @C
(
NameID int,
Type int
)
Data:
| 1 | 1 |
| 1 | 3 |
| 2 | 1 |
| 3 | 2 |
...
我想用一个基于表@C
的Type
列的条件更新表@A
中的Type
列。以下是我尝试使用的SQL查询:
UPDATE @A SET
Type1 = (CASE WHEN c.Type = 6 THEN 'Yes' ELSE 'No' END),
Type2 = (CASE WHEN c.Type = 1 THEN 'Yes' ELSE 'No' END),
Type3 = (CASE WHEN c.Type = 2 THEN 'Yes' ELSE 'No' END),
Type4 = (CASE WHEN c.Type = 3 THEN 'Yes' ELSE 'No' END),
Type5 = (CASE WHEN c.Type = 4 THEN 'Yes' ELSE 'No' END),
Type6 = (CASE WHEN c.Type = 5 THEN 'Yes' ELSE 'No' END),
FROM @A
INNER JOIN @B b ON b.Name = TypeName
INNER JOIN @C c ON c.NameID = b.NameID
SELECT * FROM @A
而不是获取预期值:
| Bob | No | Yes | No | Yes | No | No | <-- Correct
| Steve | No | Yes | No | No | No | No |
| Bill | No | No | Yes | No | No | No |
但它仍然返回了后者的结果
那么,为什么
TypeName
列Bob
的列没有正确更新?我该如何解决这一问题,以便获得我的期望值?问题是,每个人都有@C中的几行。您必须先将其设置为一行,才能更新数据:
select
NameID,
max(case Type when 1 then 1 else 0 end) as Type1,
max(case Type when 2 then 1 else 0 end) as Type2,
max(case Type when 3 then 1 else 0 end) as Type3,
max(case Type when 4 then 1 else 0 end) as Type4,
max(case Type when 5 then 1 else 0 end) as Type5,
max(case Type when 6 then 1 else 0 end) as Type6
from
@C
group by
NameID
现在无法进行测试,但您甚至可以在那里制作文本,使用类似以下内容:
UPDATE @A SET
Type1 = (CASE WHEN t.Type = 6 THEN 'Yes' ELSE 'No' END),
Type2 = (CASE WHEN t.Type = 1 THEN 'Yes' ELSE 'No' END),
Type3 = (CASE WHEN t.Type = 2 THEN 'Yes' ELSE 'No' END),
Type4 = (CASE WHEN t.Type = 3 THEN 'Yes' ELSE 'No' END),
Type5 = (CASE WHEN t.Type = 4 THEN 'Yes' ELSE 'No' END),
Type6 = (CASE WHEN t.Type = 5 THEN 'Yes' ELSE 'No' END),
FROM
(
SELECT b.Name, c.Type
FROM @C c
INNER JOIN @B b on b.NameID = c.NameID
) t
WHERE t.Name = TypeName
最大值时的案例(1为1时的案例类型,其他为0)=1,然后为“是”或“否”
以类型1结束
您可以在更新中使用此作为派生表,或者可能首先将结果收集到另一个表变量中。问题是,您每个人有几行@C。您必须先将其设置为一行,才能更新数据:
select
NameID,
max(case Type when 1 then 1 else 0 end) as Type1,
max(case Type when 2 then 1 else 0 end) as Type2,
max(case Type when 3 then 1 else 0 end) as Type3,
max(case Type when 4 then 1 else 0 end) as Type4,
max(case Type when 5 then 1 else 0 end) as Type5,
max(case Type when 6 then 1 else 0 end) as Type6
from
@C
group by
NameID
现在无法进行测试,但您甚至可以在那里制作文本,使用类似以下内容:
UPDATE @A SET
Type1 = (CASE WHEN t.Type = 6 THEN 'Yes' ELSE 'No' END),
Type2 = (CASE WHEN t.Type = 1 THEN 'Yes' ELSE 'No' END),
Type3 = (CASE WHEN t.Type = 2 THEN 'Yes' ELSE 'No' END),
Type4 = (CASE WHEN t.Type = 3 THEN 'Yes' ELSE 'No' END),
Type5 = (CASE WHEN t.Type = 4 THEN 'Yes' ELSE 'No' END),
Type6 = (CASE WHEN t.Type = 5 THEN 'Yes' ELSE 'No' END),
FROM
(
SELECT b.Name, c.Type
FROM @C c
INNER JOIN @B b on b.NameID = c.NameID
) t
WHERE t.Name = TypeName
最大值时的案例(1为1时的案例类型,其他为0)=1,然后为“是”或“否”
以类型1结束
您可以在更新中使用此作为派生表,或者可能首先将结果收集到另一个表变量中。问题是,您每个人有几行@C。您必须先将其设置为一行,才能更新数据:
select
NameID,
max(case Type when 1 then 1 else 0 end) as Type1,
max(case Type when 2 then 1 else 0 end) as Type2,
max(case Type when 3 then 1 else 0 end) as Type3,
max(case Type when 4 then 1 else 0 end) as Type4,
max(case Type when 5 then 1 else 0 end) as Type5,
max(case Type when 6 then 1 else 0 end) as Type6
from
@C
group by
NameID
现在无法进行测试,但您甚至可以在那里制作文本,使用类似以下内容:
UPDATE @A SET
Type1 = (CASE WHEN t.Type = 6 THEN 'Yes' ELSE 'No' END),
Type2 = (CASE WHEN t.Type = 1 THEN 'Yes' ELSE 'No' END),
Type3 = (CASE WHEN t.Type = 2 THEN 'Yes' ELSE 'No' END),
Type4 = (CASE WHEN t.Type = 3 THEN 'Yes' ELSE 'No' END),
Type5 = (CASE WHEN t.Type = 4 THEN 'Yes' ELSE 'No' END),
Type6 = (CASE WHEN t.Type = 5 THEN 'Yes' ELSE 'No' END),
FROM
(
SELECT b.Name, c.Type
FROM @C c
INNER JOIN @B b on b.NameID = c.NameID
) t
WHERE t.Name = TypeName
最大值时的案例(1为1时的案例类型,其他为0)=1,然后为“是”或“否”
以类型1结束
您可以在更新中使用此作为派生表,或者可能首先将结果收集到另一个表变量中。问题是,您每个人有几行@C。您必须先将其设置为一行,才能更新数据:
select
NameID,
max(case Type when 1 then 1 else 0 end) as Type1,
max(case Type when 2 then 1 else 0 end) as Type2,
max(case Type when 3 then 1 else 0 end) as Type3,
max(case Type when 4 then 1 else 0 end) as Type4,
max(case Type when 5 then 1 else 0 end) as Type5,
max(case Type when 6 then 1 else 0 end) as Type6
from
@C
group by
NameID
现在无法进行测试,但您甚至可以在那里制作文本,使用类似以下内容:
UPDATE @A SET
Type1 = (CASE WHEN t.Type = 6 THEN 'Yes' ELSE 'No' END),
Type2 = (CASE WHEN t.Type = 1 THEN 'Yes' ELSE 'No' END),
Type3 = (CASE WHEN t.Type = 2 THEN 'Yes' ELSE 'No' END),
Type4 = (CASE WHEN t.Type = 3 THEN 'Yes' ELSE 'No' END),
Type5 = (CASE WHEN t.Type = 4 THEN 'Yes' ELSE 'No' END),
Type6 = (CASE WHEN t.Type = 5 THEN 'Yes' ELSE 'No' END),
FROM
(
SELECT b.Name, c.Type
FROM @C c
INNER JOIN @B b on b.NameID = c.NameID
) t
WHERE t.Name = TypeName
最大值时的案例(1为1时的案例类型,其他为0)=1,然后为“是”或“否”
以类型1结束
您可以在更新中使用此作为派生表,或者可能首先将结果收集到另一个表变量中表A中的TypeAssigned6是什么?假设它是
Type6
,似乎编辑没有正确保存我的更改。我更新了它您确定在加入所有3个表时只得到3行吗?你应该得到4分rows@DevelopmentIsMyPassion我确定我只得到3行,因为我只更新@A
,而没有插入。如果我在@C
上进行选择,那么我将得到4行。表a中的TypeAssigned6是什么?它应该是Type6
,似乎编辑没有正确保存我的更改。我更新了它您确定在加入所有3个表时只得到3行吗?你应该得到4分rows@DevelopmentIsMyPassion我确定我只得到3行,因为我只更新@A
,而没有插入。如果我在@C
上进行选择,那么我将得到4行。表a中的TypeAssigned6是什么?它应该是Type6
,似乎编辑没有正确保存我的更改。我更新了它您确定在加入所有3个表时只得到3行吗?你应该得到4分rows@DevelopmentIsMyPassion我确定我只得到3行,因为我只更新@A
,而没有插入。如果我在@C
上进行选择,那么我将得到4行。表a中的TypeAssigned6是什么?它应该是Type6
,似乎编辑没有正确保存我的更改。我更新了它您确定在加入所有3个表时只得到3行吗?你应该得到4分rows@DevelopmentIsMyPassion我确定我只得到3行,因为我只更新@A
,而没有插入。如果我在@C
上进行选择,那么我将得到4行。这很有效!但是我不明白max()
如何帮助我解决问题?如果我要删除max()
,然后用Yes和No替换1s和0s,那么这将导致我当前的问题。当数据中每个人都有多行时,您要更新@A几次,它只会将最后的数据保留在其中。如果您执行与select相同的操作,您会发现——在不同的列中,Bob将有两行,其中有Yes。这很有效!但是我不明白max()
如何帮助我解决问题?如果我要删除max()
,然后用Yes和No替换1s和0s,那么这将导致我当前的问题。当数据中每个人都有多行时,您要更新@A几次,它只会将最后的数据保留在其中。如果您执行与select相同的操作,您会发现——在不同的列中,Bob将有两行,其中有Yes。这很有效!但是我不明白max()
如何帮助我解决问题?如果我要删除max()
,然后用Yes和No替换1s和0s,那么这将导致我当前的问题。当数据中每个人都有多行时,您要更新@A几次,它只会将最后的数据保留在其中。如果您执行与select相同的操作,您会发现——在不同的列中,Bob将有两行,其中有Yes。这很有效!但是我不明白max()
如何帮助我解决问题?如果我要删除max()
,然后用Yes和No替换1s和0s,那么这将导致我当前的问题。当数据中每个人都有多行时,您要更新@A几次,它只会将最后的数据保留在其中。如果您执行与select相同的操作,您会发现——在不同的列中,Bob将有两行,其中有Yes。