SQL Сервер: столбец с автоприращением в зависимости от значений двух столбцов - PullRequest
0 голосов
/ 09 июля 2020

Я хочу создать таблицу, аналогичную этой таблице ниже.

В первый раз эта таблица создается другой программой, но я должен вставить новые строки при добавлении изображений.

Для этого я попробовал этот запрос, но выбор выполняется перед вставкой, и функция Max бесполезна.

@idart содержит таблицу с несколькими CODE и ID_IMG, но без ORDER номер.

INSERT INTO [NOMENC_ARTICLES_IMAGES]
    SELECT 
        I.CODE, I.ID As ID_IMG, 
        CASE 
           WHEN (SELECT MAX(AI.ORDRE) FROM [NOMENC_ARTICLES_IMAGES] AS AI  
                 WHERE AI.CODE = A.CODE) IS NULL 
              THEN 0 
              ELSE (SELECT MAX(AI.ORDRE) FROM [NOMENC_ARTICLES_IMAGES] AS AI  
                    WHERE AI.CODE = A.CODE) + 1 
        END AS ORDER
    FROM 
        @idart AS I 
    LEFT JOIN
        [NOMENC_ARTICLES_IMAGES] AS A ON A.CODE = I.CODE

enter image description here

Could you help me to increment the ORDER column in terms of CODE and ID_IMG?

EDIT :

In [NOMENC_ARTICLES_IMAGES] I have :

enter image description here

And I want to add 1, 2, x value contains in @idart.

For exemple :

@idart :

enter image description here

The expected result after insert :

введите описание изображения здесь

Надеюсь, что на этом примере вы лучше поймете мою потребность

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

Думаю, я нашел решение, основанное на ответе casenonsensitive:

INSERT INTO [NOMENC_ARTICLES_IMAGES]
SELECT I.CODE, I.ID As ID_IMG, 
   row_number() over (partition by I.CODE order by I.ID) + 
    CASE WHEN A.ORDER IS NULL THEN -1 ELSE A.ORDER END As ORDER
FROM 
    @idart AS I 
LEFT JOIN
    (SELECT AI.CODE, MAX(AI.ORDER) As ORDER FROM [NOMENC_ARTICLES_IMAGES] As AI GROUP BY AI.CODE) AS A ON A.CODE = I.CODE

Спасибо всем!

0 голосов
/ 09 июля 2020

Используйте аналитическую функцию , например:

INSERT INTO [NOMENC_ARTICLES_IMAGES]
select I.CODE, I.ID As ID_IMG,
       row_number() over (partition by I.CODE order by I.ID) 
       + (select isnull(max(order), 0) from [NOMENC_ARTICLES_IMAGES] AS A ON A.CODE = I.CODE)
       As ORDER
FROM 
        @idart AS I 

Но обратите внимание, что вы всегда получаете наивысший заказ для самого высокого I.ID на I.CODE. В некоторых случаях это работает, в других I.ID не нужно строго увеличивать. Это означает, что самые новые изображения не получат самые большие ORDER

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