当包含条件或一组数据时查询问题,得到错误的结果

问题描述 投票:0回答:2

我的查询中有错误,但我不知道会发生什么。因此,这里有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就没有问题。

sql sql-server ssms
2个回答
1
投票

至少,您应该避免更新表的方式。您应该谨慎处理更新联接。如果同一行有多个值,则结果不确定。最好使用这种形式:

update table1
set table1.grade = (SELECT TOP 1 table3.grade FROM table3
                    WHERE table3.value < table1.max
                    ORDER BY table3.value DESC)

0
投票

我不确定预期的结果,但您可能已经找到问题所在:错误的条件。在进行更新之前,只需尝试使用相同的条件进行选择,例如:

select * 
from table1 inner join table3 
on table1.max > table3.value

看看你得到什么。


0
投票

至少,您应该避免更新表的方式。您应该谨慎处理更新联接。如果同一行有多个值,则结果不确定。最好使用这种形式:

update table1
set table1.grade = (select one value somehow...)
© www.soinside.com 2019 - 2024. All rights reserved.