查询问题-包含条件或一组数据时得到错误的结果
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)
我的查询有错误,但我不知道发生了什么。 所以有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)