Tenho quatro tabelas: (mostrar na imagem abaixo)
- Tópico com colunas:
- EU IRIA
- chave primária
- int
- Categoria ID
- referências à tabela Categoria
- int
- ID do usuário
- referências à tabela User
- nvarchar(128)
- EU IRIA
- Usuário com coluna:
- EU IRIA
- chave primária
- nvarchar(128)
- EU IRIA
- Categoria com coluna
- EU IRIA
- chave primária
- int
- EU IRIA
- UserCategoryLink com colunas
- ID do usuário
- chave primária
- referências à tabela User
- nvarchar(128)
- Categoria ID
- chave primária
- referências à tabela Categoria
- int
- ID do usuário
Vou atualizar a tabela Topic para que o CategoryID seja um dos CategoryID's da tabela UserCategoryLink.
PS: Eu uso o MS SQL Server.
3ª atualização: Como você pode ver neste SQL Fiddle , a categoria dos tópicos de cada usuário não está incluída na tabela UserCategoryLink, mas deve! Assim, Marc só pode ter um tópico com categoria de ciclismo e snowboard e não de moto e natação. Agora vou atualizar todas as linhas erradas (corretas também podem ser atualizadas) para um ID da coluna CategoryID da tabela UserCategoryLink.
1ª atualização: tentei o seguinte código
;WITH rs AS
(
SELECT UserID as Sid, CategoryID as Cid
FROM UserCategorieLink
)
update Topic
set CategoryID = (select top 1 Cid from rs where UserID = Sid)
where UserID = (select top 1 Sid from rs where UserID = Sid);
Mas o resultado não é escolhido aleatoriamente pelas categorias favoritas de cada usuário. Eu sei que vem, top 1
mas é porque não sei como gerar números aleatórios.
Vou pegar uma linha aleatória de uma instrução select (veja o código abaixo / como posso fazer em uma linguagem de programação como C#) , mas isso me dá um erro porque RAND
gera um número aleatório entre 0 e 1.
RAND(select top 1 Cid from rs where UserID = Sid)
Os erros são:
Sintaxe incorreta perto da palavra-chave 'selecionar'
e
Sintaxe incorreta perto de ')'.
na 7ª linha.
2ª atualização : O código também me dá o mesmo número aleatório para cada tópico que vem do mesmo usuário. Isso também pode ser um número aleatório? Eu sei que todo usuário sempre tem duas categorias favoritas. A consulta deve escolher um deles.
Eu sei que vem da where
cláusula da declaração de atualização. Mas como posso consertar isso?
Não vou passar pelo que você está tentando realizar, mas para sua atualização, você está usando um
TOP
sem umORDER BY
. Embora o SQL Server não garanta a ordem dessas consultas, ele também não escolhe aleatoriamente. Se você quiser forçar o retorno de uma linha aleatória, precisará ordenar por um número aleatório no nível da linha. Para isso, você pode usarORDER BY ABS( CHECKSUM( NEWID() ) )
.Experimente
sys.objects
para ver o comportamento de ordenar explicitamente de forma aleatória.E boa sorte com o que quer que esteja fazendo.
Editar:
@jean aponta nos comentários apenas
NEWID()
é tudo o que é necessário, o que é 100% correto, eu apenas uso a memória muscular,ABS( CHECKSUM() )
pois costumo precisar de randomização em nível de linha com um%
operador.Editar 2:
Algo assim, então?