/ / SQL multinivel une - sql, sql-server-2008, join, altiris

Uniones de múltiples niveles SQL - sql, sql-server-2008, join, altiris

Necesito unirme al menos a 4 mesas. La Tabla A es una tabla de Asociación que contiene una guía para la Tabla B y C, Parentguid (B), Childguid (C). La tabla D contiene información solo para la tabla C.

Necesito que los resultados se vean así.

B - C - D

Monitor - Nombre de la computadora - Activo

Entonces, lo principal es mostrar toda la tabla B, solo la tabla C que está conectada a B, y solo la tabla D está asociada con C.

Sospecho que necesitaré subunins (). Todavía soy un novato, tiene sentido en mi cabeza, pero no puedo hacer que el código funcione. He jugado con combinaciones durante los últimos 2 días.

FROM vHWDesktopMonitor mon             -- [Symantec_CMDB2].[dbo].[ResourceAssociation]
join ResourceAssociation RM on mon._ResourceGuid = RM.ParentResourceGuid
full outer join vComputer comp on RM.ChildResourceGuid = comp.Guid
full outer join vAsset on RM.ChildResourceGuid = vAsset._ResourceGuid

Respuestas

0 para la respuesta № 1

Si te entiendo correctamente, cualquiera de estos debería funcionar "

FROM vHWDesktopMonitor mon             -- [Symantec_CMDB2].[dbo].[ResourceAssociation]
left join ResourceAssociation RM on mon._ResourceGuid = RM.ParentResourceGuid
left join vComputer comp on RM.ChildResourceGuid = comp.Guid
left join vAsset on comp.Guid  = vAsset._ResourceGuid

o

FROM vHWDesktopMonitor mon             -- [Symantec_CMDB2].[dbo].[ResourceAssociation]
left join ResourceAssociation RM on mon._ResourceGuid = RM.ParentResourceGuid
left join (select [list fields here] from vComputer comp
join vAsset on comp.Guid  = vAsset._ResourceGuid) comp2
on RM.ChildResourceGuid = comp2.Guid

esto debería obtener todos los registros devHWDesktopMonitor y los registros asignados de ResourceAssociation con nulos para cualquier registro en vHWDesktopMonitor pero no en ResourceAssociation. Luego obtienes todos los registros en vComputer que también están en ResourceAssociation. Finalmente obtienes todos los registros en vAsset que están en vComputer. como alawys cuando obtiene todos los registros en la primera tabla, habrá nulos inteh fileds de otras tablas si no tiene un registro asociado.

Si esto no funciona, quizás necesite mostrarnos algunos datos de muestra y resultados esperados.


0 para la respuesta № 2
FROM vHWDesktopMonitor A
FULL OUTER JOIN ResourceAssociation B
on A._ResourceGuid = B.ParentResourceGuid
LEFT JOIN vComputer C
on B.ChildResourceGuid = C.Guid
LEFT JOIN vAsset D
on C.ChildResourceGuid = D._ResourceGuid

Entonces lo anterior volverá

  • Todos los registros DE A y TODOS de B (Exterior completo entre A, B)
  • Solo registros de C que están en B (IZQUIERDA entre B y C)
  • Solo registros de D que están en C (IZQUIERDA entre C y D)

Sin embargo, si aplica los límites de la cláusula where, podría reducir los registros que de otro modo se conservarían debido a las uniones izquierdas o externas ...

Por ejemplo si A._ResourceGuid = "7" existe en A pero no es "t en B; y establece donde B._ResourceGuid = "7", de lo contrario, el registro A se mantendría debido a que la unión externa completa se excluiría (¡haciendo que la unión externa completa sea lo mismo que una UNIÓN INTERNA)!

un exterior completo devolvería datos como este:

A B
7 7
2
3

si agrega una cláusula where donde B = 7, entonces puede esperar obtener debido al exterior completo ya que dijo que devuelve todos los registros de ambos ... A B 7 7 2

Pero terminarías recibiendo

A B
7 7

Porque la cláusula where ocurre DESPUÉS de la plenaexterno y por lo tanto reduce el registro A.2. Para compensar esto, debe poner los límites en la unión antes de que se ejecute el exterior completo o manejarlo en una cláusula where (pero este método es MUY desordenado y propenso a errores y problemas de rendimiento)

Por lo tanto, cuando use uniones externas, DEBE poner los criterios limitantes en la UNIÓN misma como se muestra a continuación.

FROM vHWDesktopMonitor A
FULL OUTER JOIN ResourceAssociation B
on A._ResourceGuid = B.ParentResourceGuid
and B._resourceGuid = "7"
LEFT JOIN vComputer C
on B.ChildResourceGuid = C.Guid
LEFT JOIN vAsset D
on C.ChildResourceGuid = D._ResourceGuid

También puede ponerlo en la cláusula where, pero debe recordar tener en cuenta todas las uniones externas en la tabla e incluir valores nulos para el otro (esto es desordenado y lento)

FROM vHWDesktopMonitor A
FULL OUTER JOIN ResourceAssociation B
on A._ResourceGuid = B.ParentResourceGuid
LEFT JOIN vComputer C
on B.ChildResourceGuid = C.Guid
LEFT JOIN vAsset D
on C.ChildResourceGuid = D._ResourceGuid
WHERE (A._ResourceGuid is null OR B.ParentResourceGuid ="7")