Я хотел бы предложить, чтобы сохранить еще один столбец как Index
так, чтобы сломать элемент кода в House
, Pet
и Index
и создать itemcode
из них, а также столбец идентификации в качестве первичного ключа в таблице, которая сделала бы решение проще и лучше в производительности.
Учитывая таблицу как есть, вы можете сначала получить максимальный индекс для каждого домашнего животного в доме, а затем использовать его для расчета следующего индекса и обновлениядля вновь вставленных данных.
Таблица Сценарии и Вставки
CREATE TABLE HousePet
([House] varchar(1), [Pet] varchar(3), [ItemCode] varchar(7));
INSERT INTO HousePet
([House], [Pet], [ItemCode])
VALUES
('A', 'Cat', 'ACat001'),
('A', 'Dog', 'ADog001'),
('B', 'Cat', 'BCat001'),
('A', 'Dog', 'ADog002');
-- new rows inserted for which `ItemCode` is required
INSERT INTO HousePet
([House], [Pet], [ItemCode])
VALUES
('A', 'Cat', NULL),
('C', 'Dog', NULL);
Обновление SQL
;WITH HousePetIndex AS
(
SELECT House,Pet,MAX(CONVERT(INT,REPLACE(ItemCode,House + Pet,''))) as MaxIndex
FROM HousePet
WHERE ItemCode IS NOT NULL
GROUP BY House,Pet
), HousePetInserted as
(
SELECT HP.House,HP.Pet,HP.ItemCode,ROW_NUMBER()OVER(PARTITION BY HP.House,HP.Pet ORDER BY HP.House) as ItemIndex
FROM HousePet HP
WHERE ItemCode IS NULL
)
UPDATE HP1
SET ItemCode = HP1.House + HP1.Pet + RIGHT('000'+ CONVERT(VARCHAR(2),ItemIndex + ISNULL(HP2.MaxIndex,0)),3)
FROM HousePetInserted HP1
LEFT JOIN HousePetIndex HP2
ON HP1.House = HP2.House AND HP1.Pet = HP2.Pet
SELECT * FROM HousePet
Logic
- Получить максимальный индекс для существующих данных на дом и домашнее животное в
HousePetIndex
КТРЕ
- Определить новые строки с некоторым индексом на основе
row_number
в случае, если несколько строк для того же домашних животных и дома вставлены
- Обновления
itemcode
для новых строк на основе House
, Pet
и Index
, полученных от максимального индекса и индекса или новые строки
OUTPUT
House Pet ItemCode
A Cat ACat001
A Dog ADog001
B Cat BCat001
A Dog ADog002
A Cat ACat002
C Dog CDog001
EDIT
Если вы решили добавить itemindex
и идентификатор столбца ID
, вы можете сделать ItemCode
в качестве вычисляемого столбца.
CREATE TABLE HousePet
(
ID INT IDENTITY(1,1) PRIMARY KEY,
[House] varchar(1),
[Pet] varchar(3),
[ItemIndex] INT,
[ItemCode] AS (House + Pet + RIGHT('000'+ CONVERT(VARCHAR(2),ItemIndex),3))
);
вы можете сделать что-то вроде этого
UPDATE T
SET ItemIndex = rn + MaxIndex
FROM
(
SELECT ID,House,Pet,ItemIndex,ROW_NUMBER()OVER(PARTITION BY House,Pet ORDER BY ID ASC) rn
FROM HousePet
WHERE ItemIndex IS NULL
)T
INNER JOIN
(
SELECT House,Pet,ISNULL(MAX(ItemIndex),0) as MaxIndex
FROM HousePet
GROUP BY House,Pet
) MaxIndexTable
ON MaxIndexTable.House = T.House AND MaxIndexTable.Pet = T.Pet
Какова логика этого результата? – FLICKER
, который проголосовал за этот вопрос, в аренду, пожалуйста, сообщите нам ожидаемую логику для этого вывода !! –
Пользователь хочет построить логику для генерации нового кода элемента для новых вставленных данных на основе дома и домашнего животного. поэтому недавно вставленная кошка в доме A будет иметь код элемента ACat002, поскольку кошка в доме A уже существует. – ughai