Подсчет клетки на объекты - PullRequest
0 голосов
/ 07 июня 2010

У меня снова возникла проблема: D сначала немного информации: Я пытаюсь скопировать данные из одной таблицы в другую таблицу (структура та же). теперь нужно увеличить одну ячейку, начиная с 1 на группу (как в истории).

У меня есть эта таблица:

create table My_Test/My_Test2 (
my_Id Number(8,0),
my_Num Number(6,0),
my_Data Varchar2(100));

(my_Id, my_Num - это вложенный ПК)

если я хочу вставить новую строку, мне нужно проверить, существует ли значение в my_id.
если это правда, тогда мне нужно использовать следующий my_Num для этого идентификатора.

У меня есть это в моей таблице:

My_Id   My_Num    My_Data
1       1         'test1'
1       2         'test2'
2       1         'test3'

если я добавлю строку для my_Id 1, строка будет выглядеть следующим образом: у меня есть это в моей таблице:

My_Id   My_Num    My_Data
1       3         'test4'

это звучит довольно просто, теперь мне нужно сделать это в SQL и на SQL Server у меня была такая же проблема, и я использовал это:

Insert Into My_Test (My_Id,My_Num,My_Data)
SELECT my_Id,
  (
    SELECT
      CASE (
          CASE MAX(a.my_Num)
            WHEN NULL
            THEN 0
            Else Max(A.My_Num)
          END) + b.My_Num
        WHEN NULL
        THEN 1
        ELSE (
          CASE MAX(a.My_Num)
            WHEN NULL
            THEN 0
            Else Max(A.My_Num)
          END) + b.My_Num
      END
    From My_Test A
    where my_id = 1
  )
  ,My_Data
From My_Test2 B
where my_id = 1;

этот выбор возвращает ноль, если в подвыборке строк не найдено

Есть ли способ, чтобы я мог использовать Макс в случае? и если он возвращает ноль, он должен использовать 0 или 1?

Edit: Im usung теперь это:

Insert INTO My_Test  ( My_Id,My_Num,My_Data )
SELECT B.My_Id,
  (
    SELECT COALESCE(MAX(a.My_Num),0) + b.my_Num
    FROM My_Test A
    Where a.My_Id = b.My_Id)
  ,b.My_Data
FROM My_Test2 B
WHERE My_Id = 1

THX пони Бхарату и OMG

приветствует
Ауро

Ответы [ 3 ]

0 голосов
/ 07 июня 2010
Insert Into My_Test (My_Id,My_Num,My_Data) 
select My_id,coalesce(max(My_num),0),'test4' from My_Test
where My_id=1
group by My_id
0 голосов
/ 09 июня 2010

Все решения имеют проблему в том, что они не работают в многопользовательской среде. Если два сеанса выдают этот оператор вставки одновременно, они оба получат одинаковую (my_id, my_num) комбинацию, и один из них завершится ошибкой с уникальным нарушением ограничения ORA-00001. Поэтому, если вам это нужно для работы в многопользовательской среде, лучший совет - использовать только один столбец первичного ключа и заполнить его последовательностью. Также сохраните ваш столбец my_id, так как он является столбцом сортировки по группам или столбцом внешнего ключа. Если вашим конечным пользователям действительно нравится видеть столбец «my_num» в их (веб-приложении), вы можете использовать аналитическую функцию row_number.

Подробнее об этом сценарии можно прочитать в моем блоге: http://rwijk.blogspot.com/2008/01/sequence-within-parent.html

С уважением, Роб.

0 голосов
/ 07 июня 2010

Попробуйте это

Insert Into My_Test (My_Id,My_Num,My_Data)
SELECT my_Id,(
    SELECT MAX(NVL(My_Num,0)) + 1     
    From My_Test 
    where my_id = b.my_id
  )
,My_Data
From My_Test2 B
where my_id = <your id>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...