2012-03-22 22 views
5

mam te dane w tabeli, na przykład,Jak dołączyć lewo lub wewnętrzna przyłączyć się do samej tabeli

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 

Jak mogę left join lub inner join ta sama tabela więc uzyskać ten wynik poniżej?

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

Jak mogę, że ja po prostu chcę zapytać wiersz ze słowem kluczowym z „zarządzania”, ale chcę kolumnę parent „s dane w dodać«s wiersz jak jak w zarządzać» s wynik w wierszu.

Czy to możliwe?

EDIT:

uproszczona wersja mojego rzeczywistego stole - 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 

moje rzeczywiste zapytania i jest całkiem już brudny ...

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 

wynik I Uzyskaj obecnie,

system_id main_parent  name make_accessible sort 
33   NULL   Main 0    1 

ale jestem po to,

system_id main_parent  name make_accessible sort 
33   self   Main 0    1 

Odpowiedz

9

Wystarczy odwołać się do tabeli dwukrotnie:

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

Wymień wewnętrzny z lewej przyłączyć, jeśli chcesz zobaczyć korzenie w liście.

UPDATE:

I misread swoje pytanie. Wydaje mi się, że zawsze masz dwa rzędy, zarządzasz jednym i dodajesz jeden. Aby dostać się do „Dodaj” z zarządzania:

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' 

Albo, można podzielić tabelę na dwie tabele pochodnych i połączyć je przez 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' 

To pozwoli Ci korzystać ze wszystkich kolumn z s2.

+0

dzięki za edycję i odpowiedź. przetestowałem to i dobrze to zrobiłem. dzięki! – laukok

2

AKTUALIZACJA: Łączenie przez parent_id, spróbuj:

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' 

Zmień wewnętrzna dołączyć do lewej przyłączyć, jeśli nie może być odpowiedni dodać wiersz.

+1

Nie sądzę, że powinieneś polegać na wartości ID, które zawsze są wyłączone przez jeden. Wydaje mi się to dość niebezpiecznym założeniem, ale być może pozwala na to konkretny system. – MJB

+0

@MJB: Zaktualizowałem go, aby dołączyć ** dodaj ** wiersze do ** zarządzaj ** wierszami na adresie nadrzędnym. –

+0

dziękuje Znakowi za edycję i odpowiedź. – laukok

2

Twoje dane nie są zgodne z hierarchiczną strukturą dzieci i rodziców. Na przykład Twoja kolumna parent ma wartość 10, która nie jest wartością żadnego id, więc powiązanie dziecko-rodzic nie jest możliwe.

Innymi słowy, nie ma nic, co dotyczy rekord 2,manage,null do rekordu 1,add,self lub rekordu 4,manage,null do 3,add,10, jak masz zamiar zrobić w zapytaniu.

Do reprezentowania danych hierarchicznych zazwyczaj potrzebna jest tabela z kluczem obcym, która odwołuje się do własnego klucza podstawowego. Dlatego Twoja kolumna parent musi odwoływać się do kolumny id, możesz wyrazić relację dziecko-rodzic między manage i add. Obecnie nie jest to możliwe.

+0

Przepraszam, może powinienem podać więcej szczegółów i rzeczywisty stół, nad którym pracuję. Proszę spojrzeć na moją edycję powyżej. dzięki. – laukok