【发布时间】:2015-04-02 23:09:45
【问题描述】:
我有三个按这种格式构造的表格:
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 |
我得到了这些值:
| Bob | No | Yes | No | No | No | No | <-- Incorrect (noticed the third column from the right being set to No instead of Yes)
| Steve | No | Yes | No | No | No | No |
| Bill | No | No | Yes | No | No | No |
我也尝试过将语句重写为:
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
但还是返回了后面的结果。
那么,为什么 TypeName 列 Bob 的列没有正确更新,我该如何解决这个问题,以便获得我的预期值?
【问题讨论】:
-
表 A 中的 TypeAssigned6 是什么?
-
应该是
Type6似乎编辑没有正确保存我的更改。我更新了它 -
你确定你在加入所有 3 个表时只得到 3 行吗?你应该得到 4 行
-
@DevelopmentIsMyPassion 我确定我只得到 3 行,因为我只更新
@A而不是插入。如果我在@C上进行选择,那么我将得到 4 行。
标签: sql sql-server sql-server-2008 tsql sql-update