Eu tenho um problema bastante simples, mas a solução é muito complicada. Estou tentando resolver isso a meses:
Existe uma coluna "SortID" que precisa ser atualizada com inteiros sequenciais, começando em 1. A coluna pode ficar assim (sem ORDER BY):
SELECT SortID FROM Beleg
2
3
.5
4
5
9
10
10.000001
10.000002
11
13
e precisa ficar assim.
2
3
1
4
5
6
7
8
… and so on
Eu tentei tudo que eu posso pensar, mas sem sorte.
Estou usando a função Execute SQL de dentro do Filemaker e posso usar apenas o SQL-92 simples, nada sofisticado.
Por exemplo, todos os truques a seguir não funcionam (por exemplo: Atualizar linhas existentes com número de sequência… ). Todos produzem erros de sintaxe:
ALTER TABLE MyTable ADD MyColumn int IDENTITY(1, 2) NOT NULL
e:
ALTER TABLE MyTable ADD MyColumn uniqueidentifier NOT NULL
CONSTRAINT DF_MyTable_MyColumn
DEFAULT (NEWSEQUENTIALID())
e (sem variáveis permitidas):
DECLARE @id INT
SET @id = 0
UPDATE X
SET @id = cn = @id + 1
GO
e (ROW_NUMBER () não funciona):
update T
set cn = rn
from (
select cn,
row_number() over(order by (select 1)) as rn
from TableX
) T
e (isso chega perto, mas não):
update invoice set RecNo = (next value for seq_invoice_recno)
where invoiceid in (select top 100000 invoiceid from invoice where RecNo is null
order by invoiceId)
. . . No entanto, cheguei um pouco mais perto: posso usar uma função do Filemaker "RecordNumber" que retorna um número sequencial para cada linha. Usando esta instrução, posso obter a ordem correta e obter o número inteiro correto para essa linha:
SELECT SortID, RecordNumber FROM Beleg
WHERE Year ( Valuta ) = 2016
AND Ursprungskonto = 1210
ORDER BY SortID
.5 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
10.00001 11
10.00002 12
Mas quando tento escrever os valores, recebo um erro, assim que incluo a instrução ORDER BY:
UPDATE Beleg SET SortID = RecordNumber
WHERE YEAR ( Valuta ) = 2016
AND Ursprungskonto = 1210
ORDER BY SortID
=> ERRO
Só que, quando removo o ORDER BY, os valores são escritos — mas na ordem errada!
UPDATE Beleg SET SortID = RecordNumber
WHERE YEAR ( Valuta ) = 2016
AND Ursprungskonto = 1210
1
2
3
4
5
6
7
8
… and so on
O SortID "1" deveria ter sido escrito na linha 3 e o "2" na primeira linha, o "3" na segunda linha, assim:
2
3
1
4
5
6
7
8
… and so on
Tão perto, mas ainda sem sorte.
Alguém tem alguma ideia?
Muito obrigado!
Gary
Aqui está outra abordagem, que, no entanto, provavelmente terá um desempenho pior do que a outra sugestão :
No lado positivo, esse método não apenas redefine os valores SortID em uma única etapa, mas também pode fazer isso para vários subconjuntos (Year(Valuta), Ursprungskonto) de uma só vez, se necessário. Ou seja, você pode especificar vários valores para qualquer um dos atributos na cláusula WHERE principal, por exemplo:
ou apenas remover completamente a cláusula WHERE – e cada subconjunto será renumerado separadamente dos outros, todos com uma única consulta.
Nota importante: este método assume que os valores SortID são exclusivos em qualquer subconjunto único (Year(Valuta), Ursprungskonto) .
Se você conseguir criar uma tabela e a atualização permitir que você use o resultado de uma subseleção (todo o código SQL92 válido), você poderá executar o seguinte processo de várias etapas:
Você pode precisar converter rn para numérico ou usar um tipo de dados diferente de numérico (como
double precision
).