Eu tenho uma mesa que contém dois tipos de notas. Notas de Cobrança e Notas de Entrega. Eles são estruturas de dados idênticas, portanto, usando a mesma tabela.
CREATE TABLE Notes (
Id int IDENTITY(1,1) NOT NULL,
Type int NOT NULL,
CustomerId int NOT NULL,
-- etc
)
Estou migrando dados de um sistema legado para esta tabela e existe a exigência de que as Notas de Cobrança e Entrega tenham seus próprios números sequenciais.
Eu já havia implementado duas tabelas de sequência como
CREATE TABLE CollectionNoteSequence (
Id int IDENTITY(1,1) NOT NULL,
NoteId int NOT NULL
)
onde a Id
coluna é o ID sequencial exclusivo para notas de coleção e, em seguida, a chave estrangeira NoteId para Notes.Id
.
Está chegando a hora de fazer a migração de dados final (real) e essa configuração parece difícil de trabalhar.
Existe uma maneira de agrupar as duas tabelas de sequência e adicionar um NoteNo
campo à tabela do Notes de forma que NoteNo
seja sequencial dependendo do Note.Type
? Isso é uma chave composta ou algo assim?
A nova tabela pode parecer
CREATE TABLE Notes (
Id int IDENTITY(1,1) NOT NULL,
NoteNo int NOT NULL,
Type int NOT NULL,
CustomerId int NOT NULL,
-- etc
)
e os dados ficariam assim:
Id NoteNo Type CustomerId
1 4000 1 123
2 4001 1 456
3 15123 2 789
4 4002 1 753
5 15124 2 741
Estou usando o MS SQL Server 2008.
Você pode usar
partition by
no tipo de nota, que permite que um cálculo seja redefinido por grupos. Por exemplo:Produziria os seguintes resultados, que lhe dariam uma sequência dentro do tipo de nota.
BTW, tabela produzida por http://www.sensefulsolutions.com/2010/10/format-text-as-table.html
Resposta muito simples...
Por que não 2 mesas separadas? E UNION conforme necessário ou em vista quando necessário combinado? A meu ver, uma "Nota de cobrança" e uma "Nota de entrega" são entidades separadas. Em algum momento, a definição de cada um será diferente. Eles são realmente os mesmos agora de qualquer maneira: eu esperaria algumas diferenças?
Além disso, o SQL Server 2012 também oferece suporte nativo a SEQUENCE