Ich würde vorschlagen, eine andere Spalte als Index
zu halten, um Code in House
, Pet
und Index
zu brechen und die itemcode
von diesen erstellen und auch eine Identitätsspalte als Primärschlüssel in der Tabelle haben, die die Lösung machen würde einfacher und besser in der Leistung.
Wenn Sie die Tabelle so betrachten, können Sie zuerst den maximalen Index für jedes Haustier in einem Haus ermitteln und ihn dann zum Berechnen des nächsten Index und zum Aktualisieren der itemcode
für die neu eingefügten Daten verwenden.
Tabelle Scripts und Inserts
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);
aktualisieren 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
- Erhalten Sie für bestehende Daten pro Haus max Index und PET in
HousePetIndex
CTE
- Identifizierung neue Reihen mit einem gewissen Index basierend auf
row_number
falls mehrere Zeilen für gleiches Tier und Haus eingefügt
- Aktualisieren der
itemcode
für neue Zeilen basierend auf House
, Pet
und Index
abgeleitet von max-Index und dem Index oder neue Zeilen
OUTPUT
House Pet ItemCode
A Cat ACat001
A Dog ADog001
B Cat BCat001
A Dog ADog002
A Cat ACat002
C Dog CDog001
EDIT
Wenn Sie eine itemindex
und eine Identitätsspalte ID
, können Sie ItemCode
als berechnete Spalte machen entscheiden hinzuzufügen.
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))
);
Sie können
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
wie diese etwas tun, was auf diesem Ergebnis ist die Logik? – FLICKER
wer hat diese Frage gewählt, können Sie uns bitte die erwartete Logik für diesen Ausgang wissen lassen! –
Der Benutzer möchte die Logik erstellen, um neuen Objektcode für neu eingefügte Daten basierend auf Haus und Haustier zu generieren. So hat eine neu eingefügte Katze in Haus A einen ACat002-Objektcode, da eine Katze in Haus A bereits existiert. – ughai