Обновить строки в таблице - PullRequest
1 голос
/ 18 апреля 2011

У меня есть таблица (Фрукты) со следующим столбцом

Fruit_Name(varchar2(10)) | IsDuplicate Number(1)
            Mango                    0
           Orange                    0
           Mango                     0

Что мне нужно сделать, это обновить столбец IsDuplicate на 1, где Fruit_Name в Distinct, т.е.

 Fruit_Name(varchar2(10)) | IsDuplicate Number(1)
            Mango                    1
           Orange                    1
           Mango                     0

Как мне это сделать?

Ответы [ 2 ]

4 голосов
/ 18 апреля 2011

Это должно сделать, насколько я могу судить

update fruits 
  set is_duplicate = 
      (
        select case 
                  when dupe_count > 1 and row_num = 1 then 1
                  else 0
                end as is_dupe
        from (
           select f2.fruit_name,
                  count(*) over (partition by f2.fruit_name) as dupe_count,
                  row_number() over (partition by f2.fruit_name order by f2.fruit_name) as row_num,
                  rowid as row_id
           from fruits f2
        ) ft 
        where ft.row_id = fruits.rowid
          and ft.fruit_name = fruits.fruit_name
      )

Редактировать
Но вместо фактического обновления таблицы, почему бы вам не создать представление, которое возвращает информацию. В зависимости от размера таблицы это может быть более эффективным.

create view fruit_dupe_view
as 
select fruit_name,
       case 
          when dupe_count > 1 and row_num = 1 then 1
          else 0
        end as is_duplicate
from (
   select fruit_name,
          count(*) over (partition by fruit_name) as dupe_count,
          row_number() over (partition by fruit_name order by fruit_name) as row_num
   from fruits 
) ft 
0 голосов
/ 18 апреля 2011

Прямо и просто - вы не можете. Не с ванильным SQL. SQL - это язык обработки, основанный на множествах, и вы делаете вещи в множествах. У SQL нет способа узнать, какой из ваших многочисленных манго должен быть помечен 1. Возможно, вы можете пометить один из них 1 с помощью оконных функций или ROWNUM и т. Д. В SELECT, но я не думаю, что это можно сделать с помощью ОБНОВЛЕНИЕ.

Другими словами, вашей таблице, во-первых, не хватает уникального ключа, поэтому SQL не предназначен для обработки.

Однако вы можете попробовать добавить последовательный первичный ключ в каждую строку. Затем вы можете легко написать запрос UPDATE, чтобы установить в 1 все строки с COUNT> 1 и ключом = MIN (ключ).

Другими словами, вам действительно нужно взглянуть на дизайн вашей базы данных. Реляционные базы данных не должны содержать «дубликатов». Тот факт, что вам нужно пометить что-то как дубликат, означает, что ваши таблицы изначально спроектированы неправильно. База данных не должна даже допускать дублирования для ввода в свои данные.

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