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

Query problem-getting wrong result when a condition or a set of data included

我的查询有错误,但我不知道发生了什么。 所以有3个tables.

table 1

name   grade  min  max
a
b
c
d
e

table 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

table 3

value    grade
25        A
15        B
5         C

我的目标是使用名称,显示名称的等级(最大值 > table 3 中的值)。

比如c最大30,应该是A级,而不是B和C。

另外,名字在table2中通常是全名,但有时是table2中的名字(如b)(这里是bug之一)。 table就是这个样子,我改不了。

如果我不包括检查 table 1.name = table 2.name。完全没有错误,但无法获得 b

的分数

如果我包含 table 1.name = table 2.name。那么,它有问题

对于匹配成绩的查询,就像(假设从table 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: 如果有一些数据 inlcude,则所有数据的等级将等于 = C。

例如table1,如果我不包含E,那么一切都很好。

但如果我包括 E,所有记录都会获得 C 等级。

案例 2: 如果我运行同时查询所有数据,结果就出错了。 如果我一条一条地更新记录,它就可以正常工作。, 例如,我在 update query

中再添加一个条件
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 问题的数据集时,没有问题。 但是如果我把数据放在一起,就会出现问题。

这就是所有情况。我不知道是什么导致了这个问题。请帮助

结果应该是: table 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,结果将是

table 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,结果将是

table 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 ,结果将是

table 1

name   grade  min  max
a        C     1    10
b        B     2    20
c        A     3    30
d        C     1    10

with table1.name = table2.name 但仅针对 e,结果将为

name   grade  min  max
e        B     2    20

这些情况发生在我 运行 整个 table 的更新查询时。 如果我逐行更新,table1.name = table2.name 没有问题。

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

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

看看你得到了什么。

至少,你应该避免更新 table 的方式。您应该小心更新时的连接。如果同一行碰巧有多个值,则结果是不确定的。最好使用这种形式:

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