我有两个表Test1
和Corr_table
奇怪的SQL查询行为
Test1的表创建脚本:
CREATE TABLE [dbo].[Test1](
[id] [bigint] NOT NULL,
[Country] [varchar](3) NULL,
[PeriodKey] [varchar](max) NULL,
[a] [varchar](3) NULL,
[b] [varchar](3) NULL,
[c] [varchar](3) NULL
)
Test1
数据:
id Country PeriodKey a b c
1 E 201201 1 5 9
1 E 201202 1 5 9
3 G 201203 3 7 11
4 H 201204 4 8 12
Corr_table
创建脚本:
CREATE TABLE [dbo].[corr_table](
[Country] [varchar](5) NULL,
[id] [bigint] NULL,
[Field] [varchar](10) NULL,
[Value] [varchar](50) NULL,
[Start_date] [varchar](50) NULL,
[End_date] [varchar](50) NULL
)
corr_table
数据:
Country id Field Value Start_date End_date
E 1 a 4 201201 201202
E 1 b 6 201201 201202
现在,如果我写这篇文章的查询,
select
a = case when x.Field = 'a' then x.value else a end,
b = case when x.Field = 'b' then x.value else b end,
y.*
from
dbo.Test1 y,dbo.corr_table x
where
y.id = 1
and y.Country = 'E'
and y.PeriodKey in (201201)
它提供了以下结果:
a b id Country PeriodKey a b c
4 5 1 E 201201 1 5 9
1 6 1 E 201201 1 5 9
,而我期待下面的结果:
a b id Country PeriodKey a b c
4 6 1 E 201201 1 5 9
为什么两列不在一行中更新?它一次只更新一列,但应更新列
即a应为4,b应在单行中为6。但只更新一个,为什么呢?
其一,你**不加入**你的表在所有 - 你只是创建一个笛卡尔乘积 - 是真的想你要? [另外,你应该停止使用旧的JOIN语法](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old -style-joins.aspx)可能会导致这样的错误 - 忘记提供任何JOIN条件并因此创建笛卡尔积 –
您能展示您期望的结果吗? –
你能解释你的WHERE情况吗?我不明白过滤标准。 –