2010-08-10 10 views
13

Tengo una base de datos SQL que contiene múltiples tablas relacionales. Hay algunos campos en la tabla maestra que hacen referencia a otra tabla varias veces. Por ejemplo, supongamos que tengo una base de datos de vendedores que son responsables de las ventas de varios estados. Mi base de datos tiene campos para State1, State2 y State3, todos los cuales vuelven a una tabla de Estados. No puedo entender cómo escribir una consulta para devolver un registro con todos los estados enumerados. Si solo necesitaba un campo de estado, sé que lo haría:Selección SQL con múltiples referencias a la tabla única

SELECT Master.Name, State.Enumeration AS 'State' 
FROM MasterTable Master, StateTable State 
WHERE Master.State1 = State.ID; 

¿Cómo puedo expandir esto para todos mis campos estatales?

Gracias.

Respuesta

11

Volviendo una columna de cada uno de los únicos une a los estados:

select m.Name, s1.Enumeration as State1, s2.Enumeration as State2, s3.Enumeration as State3 
from MasterTable m 
left join StateTable s1 on m.State1 = s1.ID 
left join StateTable s2 on m.State2 = s2.ID 
left join StateTable s3 on m.State3 = s3.ID 

Volviendo 1 columna de todos los estados de la 3 se une a:

select m.Name, ISNULL(s1.Enumeration + ',','') 
       + ISNULL(s2.Enumeration + ',','') 
       + ISNULL(s3.Enumeration,'') as Enumeration 
from MasterTable m 
left join StateTable s1 on m.State1 = s1.ID 
left join StateTable s2 on m.State2 = s2.ID 
left join StateTable s3 on m.State3 = s3.ID 

También hay columnas-consultas. ..

select m.Name, 
ISNULL((select Enumeration from StateTable where ID = m.State1),'') as State1, 
ISNULL((select Enumeration from StateTable where ID = m.State2),'') as State2, 
ISNULL((select Enumeration from StateTable where ID = m.State3),'') as State3 
from MasterTable m 
+0

+1: para agregar LEFT JOIN alternativa –

+0

@ lumberjack4: No hay diferencia en el rendimiento entre la sintaxis ANSI-89 que ha publicado, y ANSI-92 de Fosco. El beneficio de ANSI-92 es la sintaxis OUTER JOIN estandarizada y ampliamente soportada (IZQUIERDA, DERECHA al menos). –

+1

Gracias a los dos .. me di cuenta cuando estaba editando para agregar la segunda consulta. – Fosco

6

Debes usar alias de tabla para unir varias copias de la misma tabla:

SELECT m.Name, 
      s1.Enumeration AS 'State1', 
      s2.Enumeration AS 'State2' 
    FROM MasterTable m 
LEFT JOIN StateTable s1 = s1.id = m.state1 
LEFT JOIN StateTable s2 = s1.id = m.state2 

Una unión INNER requiere que los datos estén presentes; de lo contrario, se excluye todo el registro. UN ENLACE IZQUIERDO es más seguro, como si el estado 1/2/3/etc permite valores NULL ...

+0

Esperaba evitar una unión explícita, pero parece que así debe ser. – lumberjack4

+0

@ lumberjack4 ¿por qué? – JNK

+0

Entiendo que mi consulta original se une entre bastidores, supongo que no estoy lo suficientemente cómodo con la base de datos para saber cuándo usar qué unirse. – lumberjack4

Cuestiones relacionadas