Posso usar a declaração CASO em condição de JUNTO?

A imagem seguinte faz parte do Microsoft SQL Server 2008 R2 System Views. Da imagem podemos ver que a relação entre sys.partitions' esys.allocation_units' depende do valor de `sys.allocation_units.type'. Então para juntá-las eu escreveria algo similar a isto:

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 dá um erro de sintaxe. Acho que isso's por causa da declaração CASE. Alguém pode ajudar a explicar um pouco?


Adicionar mensagem de erro:

Msg 102, Level 15, State 1, Line 6 Sintaxe incorrecta perto de '='.

Solução

Uma expressão CASE retorna um valor da parte THEN da cláusula. Você poderia utilizá-la assim:

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) AND a.container_id = p.hobt_id THEN 1
           WHEN a.type IN (2) AND a.container_id = p.partition_id THEN 1
           ELSE 0
           END = 1

Note que você precisa fazer algo com o valor retornado, por exemplo, compará-lo com 1. Sua declaraçã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". (Se oBOOLEAN` fosse um datatype então o teste para igualdade faria sentido).

Comentários (6)

Em vez disso, você simplesmente se junta a ambas as tabelas, e na sua cláusula SELECT, devolver dados daquele que corresponde:

Eu sugiro que você passe por este link Conditional Joins in SQL Server e https://stackoverflow.com/questions/8361183/t-sql-case-statement-in-a-join-on-clause

por exemplo

    SELECT  *
FROM    sys.indexes i
        JOIN sys.partitions p
            ON i.index_id = p.index_id 
        JOIN sys.allocation_units a
            ON a.container_id =
            CASE
               WHEN a.type IN (1, 3)
                   THEN  p.hobt_id 
               WHEN a.type IN (2)
                   THEN p.partition_id
               END 

Editar: De acordo com os comentários.

Não é possível especificar a condição de adesão como se está a fazer. Verificar a condição de consulta acima que não tem erro. Eu retirei a coluna comum para cima e o valor da coluna da direita será avaliado na condição.

Comentários (9)

Experimenta isto:

...JOIN sys.allocation_units a ON 
  (a.type=2 AND a.container_id = p.partition_id)
  OR (a.type IN (1, 3) AND a.container_id = p.hobt_id)
Comentários (1)