Общие > Базы данных
UPDATE в таблице с условием. которое повторяется.
(1/1)
Yukko:
Может я торможу, но решения так и не нашел. Использую MsSQL2000.
Вот моя структура таблицы
------------------------------
|usernane | clicked |
------------------------------
username - уникальный
clicked - нет, в нем могут быть значения NULL, туда заносятся данные типа 3e1eb81d2c9440edrf382f55d298edb7 поле типа varchar 32
После операций наших финансовых воротил, они должны тыцнуть кнопочку и скрипт должен испольнить запрос типа, который приведен ниже, столько раз сколько они введут в форме.
Сам запрос:
SET ROWCOUNT 2
UPDATE dbo.USERS
SET Clicked = NULL
FROM users
WHERE (clicked = \'3e1eb81d2c9440edrf382f55d298edb7\')
Т.е. поменять clicked на NULL какому пользователю не важно важно скольким пользователям (т.е. сколько раз).
Конечно я могу выбрать все строки где поле clicked не равно NULL и попорядку сделать update, но, думаю, что есть более эффективное решение на стороне сервера.
Варианты, которые я попробовал:
1.
SET ROWCOUNT 2
UPDATE dbo.USERS
SET Clicked = NULL
FROM users
WHERE (clicked is not null)
2.
UPDATE dbo.USERS
SET Clicked = NULL
FROM (SELECT TOP 2 username, Clicked
FROM dbo.USERS
WHERE clicked IS NOT NULL) AS t1
WHERE (users.username = t1.username)
В обоих вариантах, если подставлять реальные значения и писать
clicked = \'реальное значение\' оба запроса выполняются, если в запись с другиму значением username внести такое же значение clicked, то запросы не выполняются.
UPDATE (Searched)
The UPDATE (Searched) statement changes data in existing rows of a table. UPDATE (Searched) is a standard Transact-SQL statement.
В мануале по MsSQL пишут такое:
Syntax
UPDATE {table_name | view_name} SET [table_name. | view_name.] {column_name={expression | NULL | (select_statement)}[,...]} [FROM {table_name | view_name}[,...]] [WHERE search_condition]
...
...
search_condition
Is any expression that can legally follow the standard Transact-SQL WHERE clause.
Последняя строка говорит о том что выражение после where любым выражением, какое допускается в стандартной Transact SQL WHERE-связке. Я так понимаю, что если select * from users where clicked is not null результаты выдает, то выражение is not null может
legally follow the standard Transact-SQL WHERE clause.
Укажите на ошибку пожалуйста...
Yukko:
Спасибо всем, кто думал, я расторомозился на следующее утро, а вот сказал только сейчас :) не было инета два дня. Правильный с некоторыми оговорками вариант:
UPDATE users
SET clicked = NULL
FROM (SELECT TOP 3 *
FROM users
WHERE сlicked IS NOT NULL) AS t1
WHERE t1.username = users.username
В TOP указывается количество записей. Не работает, если количество записей для UPDATE равно количеству существующих записей, которые удовлетворяют условию, почему не знаю, если меньше, то все ОК. Буду думать дальше.
Навигация
Перейти к полной версии