Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用另一个表中的一列更新一个表中的多列_Sql_Sql Server_Sql Server 2008_Tsql_Sql Update - Fatal编程技术网

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。