Автор Тема: UPDATE в таблице с условием. которое повторяется.  (Прочитано 2072 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Yukko

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1586
  • +0/-0
  • 0
    • Просмотр профиля
    • http://estrabota.com.ua
Может я торможу, но решения так и не нашел. Использую 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.

Укажите на ошибку пожалуйста...
« Последнее редактирование: 04 Августа 2003, 22:34:10 от Yukko »
работа в Украине

Оффлайн Yukko

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1586
  • +0/-0
  • 0
    • Просмотр профиля
    • http://estrabota.com.ua
UPDATE в таблице с условием. которое повторяется.
« Ответ #1 : 07 Августа 2003, 18:26:26 »
Спасибо всем, кто думал, я расторомозился на следующее утро, а вот сказал только сейчас :) не было инета два дня. Правильный с некоторыми оговорками вариант:
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 равно количеству существующих записей, которые удовлетворяют условию, почему не знаю, если меньше, то все ОК. Буду думать дальше.
работа в Украине

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28