我的查询中有错误,但我不知道会发生什么。因此,这里有3张桌子。
表1
name grade min max
a
b
c
d
e
表2
fullname name min max
a a123 1 10
bbbb b 2 20
c cccc 3 30
d dd 1 10
E Ed 2 20
表3
value grade
25 A
15 B
5 C
我的目标是使用名称,显示名称的等级(表3中的max>值)。
例如,c的最大值为30,它应该具有A等级,而不是B和C。
[此外,名称通常是表2中的全名,但有时它是表2中的名称(如b)(这是错误之一)。这就是表格的样子,我无法更改。
如果我不包括检查table 1.name = table 2.name
。完全没有错误,但无法获得b
如果我包含table 1.name = table 2.name
。那么它有问题
对于匹配等级的查询,就像(假设从表2之前获得最小值和最大值)
update table1
set table1.grade = table3.grade
from table1 inner join table3
on table1.max > table3.value
所有情况都包括检查table 1.name = table 2.name
情况1:如果有某些数据指示,则所有数据的等级等于= C。
例如,在表1中,如果我不包括E,那么一切都很好。
但是如果我包括E,所有记录将获得C级。
情况2:如果我同时对所有数据运行查询,结果将出错。如果我一张一张地更新记录,效果很好。例如,我在更新查询中添加了一个条件
update table1
set table1.grade = table3.grade
from table1 inner join table3
on table1.max > table3.value and fullname='c'
得到错误结果后,我添加条件并再次运行它,那么c将获得等级“ A”而不是“ C”。但是如果我删除条件并再次运行查询。c将再次获得等级'C'。
情况3:当我仅运行将独立导致情况1问题的数据集时,没有问题。但是如果我把数据放在一起,就会出现问题。
就是所有情况。我不知道是什么原因造成的。请帮助
结果应为:表1
name grade min max
a C 1 10
b B 2 20
c A 3 30
d C 1 10
e B 2 20
如果我删除table1.name = table2.name
,结果将是
表1
name grade min max
a C 1 10
b null null null
c A 3 30
d C 1 10
e B 2 20
使用table1.name = table2.name
,结果将是
表1
name grade min max
a C 1 10
b C 2 20
c C 3 30
d C 1 10
e C 2 20
使用table1.name = table2.name
,但删除e,结果将是
表1
name grade min max
a C 1 10
b B 2 20
c A 3 30
d C 1 10
使用table1.name = table2.name
,但仅用于e,结果为
name grade min max
e B 2 20
这些情况在我为整个表运行更新查询时发生。如果我逐行更新每一行,table1.name = table2.name
就没有问题。
至少,您应该避免更新表的方式。您应该谨慎处理更新联接。如果同一行有多个值,则结果不确定。最好使用这种形式:
update table1
set table1.grade = (SELECT TOP 1 table3.grade FROM table3
WHERE table3.value < table1.max
ORDER BY table3.value DESC)
我不确定预期的结果,但您可能已经找到问题所在:错误的条件。在进行更新之前,只需尝试使用相同的条件进行选择,例如:
select *
from table1 inner join table3
on table1.max > table3.value
看看你得到什么。
至少,您应该避免更新表的方式。您应该谨慎处理更新联接。如果同一行有多个值,则结果不确定。最好使用这种形式:
update table1
set table1.grade = (select one value somehow...)