T-SQL запрос с забавным поведением - PullRequest
0 голосов
/ 16 марта 2009

Допустим, у вас есть следующие две таблицы:

X Таблица

X_ID Y_ID_F X_Value

1     1     Q
2     1     G
3     1     T
4     2     W
5     2     K
...

Y Таблица

Y_ID Y_Value

1     A
2     B
...

Вы хотите запросить только те свойства, у которых родительское значение Y равно A, и обновить их, чтобы вы написали запрос следующим образом (я понимаю, что запрос получше, но терпите меня):


UPDATE X set X_Value = 'O' 
WHERE X_ID IN
(
select distinct X.X_ID FROM X
INNER JOIN Y ON X.Y_ID_F = Y.Y_ID
WHERE Y.Y_Value = 'A'
)

Раньше я думал, что это будет делать то, что, по-видимому, говорит: обновите строки таблицы X, в которой Y_Value объединенной таблицы Y = 'A'. Однако кажется, что X.X_ID приводит к обновлению всех строк в таблице X, а не только тех, которые, как вы думаете, ограничены предложением WHERE. Каким-то образом X.X_ID заставляет запрос полностью игнорировать попытку предложения where при ограничении набора обновляемых строк. Есть идеи, почему?

РЕДАКТИРОВАТЬ: Я думаю, что это как-то связано с тем, как таблицы в базе данных, к которой я обращаюсь, связаны, и не так просто, как в примере, к которому я пытался это сделать.

Ответы [ 2 ]

3 голосов
/ 16 марта 2009

Мне никогда не везло с подвыборами в выражении UPDATE. Вместо этого попробуйте что-то вроде следующего:

UPDATE X SET X_Value = 'O'
FROM Y
WHERE Y.Y_ID = X.Y_ID_F
  AND Y.Y_Value = 'A'
0 голосов
/ 16 марта 2009

Для меня это тоже не имело никакого смысла, поэтому я попробовал. После выполнения оператора update содержимое таблицы X выглядит следующим образом:

X_ID   Y_ID   X_VALUE
1      1      O
2      1      O
3      1      O
4      2      W
5      2      K

Другими словами, результаты, которые я ожидал. Вы уверены, что здесь нет чего-то еще? Я заметил небольшую аномалию в вашем примере запроса: ссылка на «X.Y_ID_F» в условии соединения, где я ожидал увидеть только «X.Y_ID». Я предположил, что это была просто опечатка.

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