Запросить проблему - получить неправильный результат, когда условие или набор данных включены - PullRequest
0 голосов
/ 17 апреля 2020

В моем запросе есть ошибка, но я не знаю, что произойдет. Таким образом, есть 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

моя цель - использовать имя , покажите оценку имени (max> значение в таблице 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 для всех данных, если есть некоторые данные включены.

Например, в таблице 1, если я не включаю E, то все в порядке.

, но если я включу E, получит оценку C для всех записей .

case 2: если я запускаю запрос для всех данных одновременно, результат искажается. это работает нормально, если я обновляю запись по одной. Например, я добавляю еще одно условие в запрос на обновление

update table1
set table1.grade = table3.grade
from table1 inner join table3 
on table1.max > table3.value and fullname='c'

после получения неверного результата, я добавляю условие и запускаю его снова, затем c получит оценку «А» вместо «C». но если я удаляю условие и снова запускаю запрос. c снова получит оценку 'C'.

case 3: нет проблем, когда я только запускаю набор данных, который вызовет проблему case 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 проблем не возникает, если я обновляю каждую строку одну за другой.

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

По крайней мере, вам следует избегать способа обновления таблицы. Вы должны быть осторожны с обновлениями. Если у вас есть несколько значений для одной и той же строки, результат не определен c. Лучше использовать эту форму:

update table1
set table1.grade = (SELECT TOP 1 table3.grade FROM table3
                    WHERE table3.value < table1.max
                    ORDER BY table3.value DESC)
0 голосов
/ 17 апреля 2020

Я не уверен в ожидаемых результатах, но вы, возможно, уже отследили проблему: неверные критерии. Перед обновлением просто попробуйте выбрать с теми же критериями, например:

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

и посмотрите, что вы получите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...