首页 > 解决方案 > 查询问题——包含一个条件或一组数据时得到错误结果

问题描述

我的查询中有错误,但我不知道会发生什么。所以有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 中的最大值 > 值)。

例如,c 最多 30,它应该有 A 级,而不是 B 和 C。

此外,名称通常是表 2 中的全名,但有时它是表 2 中的名称(如 b)(这是错误之一)。桌子就是这样的,我不能改变它。

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

如果我包括table 1.name = table 2.name.then,它有问题

对于匹配等级的查询,它就像(假设从表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。

例如,在table1中,如果我不包括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

但删除 e ,table1.name = table2.name结果将是

表格1

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

但仅适用于table1.name = table2.namee,结果将是

name   grade  min  max
e        B     2    20

当我对整个表运行更新查询时,就会发生这种情况。table1.name = table2.name如果我一一更新每一行是没有问题的。

标签: sqlsql-serverssms

解决方案


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

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

推荐阅读