A imagem a seguir faz parte do Microsoft SQL Server 2008 R2 System Views. A partir da imagem, podemos ver que a relação entre sys.partitions
e sys.allocation_units
depende do valor de sys.allocation_units.type
. Então, para juntá-los, eu escreveria algo semelhante a este:
SELECT *
FROM sys.indexes i
JOIN sys.partitions p
ON i.index_id = p.index_id
JOIN sys.allocation_units a
ON CASE
WHEN a.type IN (1, 3)
THEN a.container_id = p.hobt_id
WHEN a.type IN (2)
THEN a.container_id = p.partition_id
END
Mas o código superior fornece um erro de sintaxe. Eu acho que é por causa da CASE
declaração. Alguém pode ajudar a explicar um pouco?
Adicionar mensagem de erro:
Msg 102, Nível 15, Estado 1, Linha 6 Sintaxe incorreta próxima a '='.
sql
sql-server
join
case
Apenas um aprendiz
fonte
fonte
Respostas:
Uma
CASE
expressão retorna um valor daTHEN
parte da cláusula. Você poderia usá-lo assim:Observe que você precisa fazer algo com o valor retornado, por exemplo, compará-lo com 1. Sua instrução tentou retornar o valor de uma atribuição ou teste de igualdade, nenhum dos quais faz sentido no contexto de uma cláusula
CASE
/THEN
. (SeBOOLEAN
fosse um tipo de dados, o teste de igualdade faria sentido.)fonte
= 1
para= 0
, mas acho que você não gostará do resultado.Sugiro que você acesse este link Associações condicionais no SQL Server e declaração de caso T-SQL em uma cláusula JOIN ON
por exemplo
Editar: conforme comentários.
fonte
conditional join
significa Cada junção (excluindo cruz) é uma condicional. Como esse caso é diferente de qualquer outro? Sua amostra tem associação interna com a condição, assim como a consulta OPs tem associação com a condição.OR
?OR
". UsarOR
é apenas uma maneira de implementá-lo.OR
e 2ANDs
ou com 1CASE
. É uma consulta de rotina que não tem nada que a diferencie de qualquer outra.Tente o seguinte:
fonte
Eu acho que você precisa de duas declarações de caso:
Isto é porque:
fonte
Peguei seu exemplo e editei:
fonte
Isso parece legal
https://bytes.com/topic/sql-server/answers/881862-joining-different-tables-based-condition
fonte
Sim você pode. Aqui está um exemplo.
fonte
Tomou o exemplo de DonkeyKong.
O problema é que eu precisava usar uma variável declarada. Isso permite indicar o lado esquerdo e direito do que você precisa comparar. Isso serve para dar suporte a um relatório do SSRS em que campos diferentes devem ser vinculados com base na seleção do usuário.
O caso inicial define a escolha do campo com base na seleção e, em seguida, posso definir o campo que eu preciso corresponder para a associação.
Uma segunda declaração de caso pode ser adicionada para o lado direito se a variável for necessária para escolher entre campos diferentes
fonte
Aqui, comparei a diferença em dois conjuntos de resultados diferentes:
fonte