2012-03-22 15 views
5

tengo estos datos en una tabla, por ejemplo,Cómo unirse a la izquierda o unirse a una tabla interna en sí

id  name  parent  parent_id 
1  add   self  100 
2  manage  null  100 
3  add   10   200 
4  manage  null  200 
5  add   20   300 
6  manage  null  300 

Cómo puedo left join o inner join esta tabla en sí, así que conseguir este resultado por debajo?

id  name  parent 
2  manage  self 
4  manage  10 
6  manage  20 

Como puede yo que sólo quieren consultar la fila con la palabra clave de 'manejar' pero yo quiero la columna parent 'de datos s en añaden 's fila que el que en gestionar' s fila en el resultado.

¿Es posible?

EDIT:

la versión simplificada de mi mesa real - system,

system_id parent_id type function_name  name  main_parent   make_accessible  sort 
31   30   left main    Main  NULL    0     1 
32   31   left page_main_add  Add   self    0     1 
33   31   left page_main_manage Manage  NULL    0     2 

mi consulta real y es bastante complicado ya ...

SELECT 
    a.system_id, 
    a.main_parent, 
    b.name, 
    b.make_accessible, 
    b.sort 

FROM system AS a 

INNER JOIN -- self -- 
(
    SELECT system_id, name, make_accessible, sort 
    FROM system AS s2 

    LEFT JOIN -- search -- 
    (
    SELECT system_id AS parent_id 
    FROM system AS s1 
    WHERE s1.function_name = 'page' 
    ) AS s1 

    ON s1.parent_id = s2.parent_id 

    WHERE s2.parent_id = s1.parent_id 
    AND s2.system_id != s1.parent_id 
    ORDER BY s2.sort ASC 
) b 
ON b.system_id = a.parent_id 


WHERE a.function_name LIKE '%manage%' 
ORDER BY b.sort ASC 

resultado que obtén actualmente,

system_id main_parent  name make_accessible sort 
33   NULL   Main 0    1 

pero estoy después de esto,

system_id main_parent  name make_accessible sort 
33   self   Main 0    1 

Respuesta

9

sólo tiene que hacer referencia a la tabla dos veces:

select t1.id, t1.name, t2.id, t2.name 
from TableA t1 
    inner join TableA t2 
    on t1.parent_id = t2.Id 

Reemplazar interior con unirse a izquierda si quieres ver las raíces de la lista.

ACTUALIZACIÓN:

me interpretó mal su pregunta. Me parece que siempre tienes dos filas, administra una y agrega una. Para llegar a "Añadir" de gestionar:

select system.*, (select parent 
        from system s2 
        where s2.parent_id = system.parent_id 
        and s2.name = 'add') 
       AS parent 
from system 
where name = 'manage' 

O bien, puede dividir la tabla en dos tablas derivadas y unirse a ellos por parent_id:

select * 
    from system 
    inner join 
    (
    select * from system where name = 'add' 
) s2 
    on system.parent_id = s2.parent_id 
    where system.name = 'manage' 

Esto permitirá que pueda utilizar todas las columnas de s2.

+0

gracias por la edición y la respuesta. lo probé y lo hice bien. ¡Gracias! – laukok

2

ACTUALIZADO: unión por parent_id, probar:

select m.id, m.name, a.parent 
from myTable m 
join myTable a on m.parent_id = a.parent_id and a.name = 'add' 
where m.name = 'manage' 

Cambiar la combinación interna a una combinación izquierda si no puede haber una correspondiente añadir fila.

+1

No creo que deba confiar en que los valores de ID siempre estén desactivados en uno. Parece una suposición bastante peligrosa para mí, pero tal vez el sistema particular lo permita. – MJB

+0

@MJB: lo he actualizado para unir ** filas ** para ** administrar ** filas en parent_id, en su lugar. –

+0

gracias Marcar para la edición y la respuesta. – laukok

2

Sus datos no se ajustan a una estructura jerárquica padre-hijo. Por ejemplo, su columna parent contiene el valor 10, que no es el valor de id, por lo que no es posible una asociación padre-hijo.

En otras palabras, no hay nada que se refiera el acta 2,manage,null al registro 1,add,self, o el registro 4,manage,null a 3,add,10, ya que la intención de hacer en su consulta.

Para representar datos jerárquicos, generalmente necesita una tabla que tenga una clave externa que haga referencia a su propia clave principal. Por lo tanto, su columna parent debe hacer referencia a la columna id, luego puede expresar una relación padre-hijo entre manage y add. Actualmente, eso no es posible.

+0

lo siento, tal vez debería haber proporcionado más detalles y la tabla real en la que estoy trabajando. por favor, eche un vistazo a mi edición anterior. Gracias. – laukok

Cuestiones relacionadas