Как покинуть соединение или внутреннее соединение самого стола - PullRequest
5 голосов
/ 22 марта 2012

У меня есть эти данные в таблице, например,

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

Как мне left join или inner join сама эта таблица, чтобы я получил этот результат ниже?

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

Как вы можете, я просто хочу запросить строку с ключевым словом 'manage', но хочу, чтобы данные столбца parent в добавили строку как в управлять строкой в ​​результате.

Возможно ли это?

EDIT:

упрощенная версия моей фактической таблицы - 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

мой фактический запрос, и он уже довольно грязный ...

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

результат, который я получаю в настоящее время,

system_id   main_parent     name    make_accessible sort
33          NULL            Main    0                1

но я после этого,

system_id   main_parent     name    make_accessible sort
33          self            Main    0                1

Ответы [ 3 ]

9 голосов
/ 22 марта 2012

Вам просто нужно сослаться на таблицу дважды:

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

Замените внутреннее на левое соединение, если вы хотите видеть корни в списке.

UPDATE:

Я неправильно понял ваш вопрос. Мне кажется, что у вас всегда есть два ряда, вы можете управлять одним и добавить один. Чтобы попасть в «Добавить» из управления:

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'

Или вы можете разбить таблицу на две производные таблицы и объединить их по 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'

Это позволит вам использовать все столбцы из s2.

2 голосов
/ 22 марта 2012

Ваши данные не подчиняются иерархической структуре дочерний-родительский.Например, ваш столбец parent содержит значение 10, которое не является значением какого-либо id, поэтому связь между дочерними и родительскими объектами невозможна.

Другими словами, ничто не связывает запись 2,manage,null с записью 1,add,self или запись от 4,manage,null до 3,add,10, как вы собираетесь сделать в своем запросе.

Для представления иерархических данных обычно требуется таблица с внешним ключом, который ссылается на собственный первичный ключ.Таким образом, ваш столбец parent должен ссылаться на столбец id, тогда вы можете выразить дочерние и родительские отношения между manage и add.В настоящее время это невозможно.

2 голосов
/ 22 марта 2012

ОБНОВЛЕНО: присоединение по parent_id, попробуйте:

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'

Измените внутреннее объединение на левое, если не может быть соответствующей строки add .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...