Рекурсия Sql без рекурсии

Можно использовать jQuery attr () функция. Например, если бы Ваш img тег имеет id атрибут 'my_image', Вы сделали бы это:


Затем можно измениться src из изображения с jQuery как это:

$("#my_image").attr("src","second.jpg");

Для присоединения этого к click событие Вы могли записать:

$('#my_image').on({
    'click': function(){
        $('#my_image').attr('src','second.jpg');
    }
});

Для вращения изображения Вы могли сделать это:

$('img').on({
    'click': function() {
         var src = ($(this).attr('src') === 'img1_on.jpg')
            ? 'img2_on.jpg'
            : 'img1_on.jpg';
         $(this).attr('src', src);
    }
});

7
задан skaffman 24 August 2009 в 20:20
поделиться

6 ответов

В Oracle :

SELECT  group_id
FROM    group_members
START WITH
        entity_id = :user_id
CONNECT BY
        entity_id = PRIOR group_id

В SQL Server :

WITH    q AS
        (
        SELECT  group_id, entity_id
        FROM    group_members
        WHERE   entity_id = @user_id
        UNION ALL
        SELECT  gm.group_id, gm.entity_id
        FROM    group_members gm
        JOIN    q
        ON      gm.entity_id = q.group_id
        )
SELECT  group_id
FROM    q

В PostgreSQL 8.4 :

WITH RECURSIVE
        q AS
        (
        SELECT  group_id, entity_id
        FROM    group_members
        WHERE   entity_id = @user_id
        UNION ALL
        SELECT  gm.group_id, gm.entity_id
        FROM    group_members gm
        JOIN    q
        ON      gm.entity_id = q.group_id
        )
SELECT  group_id
FROM    q

В PostgreSQL 8.3 и ниже:

CREATE OR REPLACE FUNCTION fn_group_members(INT)
RETURNS SETOF group_members
AS
$$
        SELECT  group_members
        FROM    group_members
        WHERE   entity_id = $1
        UNION ALL
        SELECT  fn_group_members(group_members.group_id)
        FROM    group_members
        WHERE   entity_id = $1;
$$
LANGUAGE 'sql';

SELECT  group_id
FROM    group_members(:myuser) gm
16
ответ дан 6 December 2019 в 07:51
поделиться

Есть способов избежать рекурсии в запросах древовидной иерархии (в отличие от того, что здесь говорят).

Я чаще всего использовал ] Вложенные наборы .

Однако, как и в случае со всеми жизненными и техническими решениями, приходится идти на компромиссы. Вложенные наборы часто обновляются медленнее, но гораздо быстрее запрашиваются. Существуют умные и сложные способы повышения скорости обновления иерархии, но есть еще один компромисс; производительность и сложность кода.

Простой пример вложенного набора ...

Древовидное представление:

 -Electronics
 |
 |-Televisions
 | |
 | |-Tube
 | |-LCD
 | |-Plasma
 |
 |-Portable Electronics
   |
   |-MP3 Players
   | |
   | |-Flash
   |
   |-CD Players
   |-2 Way Radios

Представление вложенного набора

+-------------+----------------------+-----+-----+
| category_id | name                 | lft | rgt |
+-------------+----------------------+-----+-----+
|           1 | ELECTRONICS          |   1 |  20 |
|           2 | TELEVISIONS          |   2 |   9 |
|           3 | TUBE                 |   3 |   4 |
|           4 | LCD                  |   5 |   6 |
|           5 | PLASMA               |   7 |   8 |
|           6 | PORTABLE ELECTRONICS |  10 |  19 |
|           7 | MP3 PLAYERS          |  11 |  14 |
|           8 | FLASH                |  12 |  13 |
|           9 | CD PLAYERS           |  15 |  16 |
|          10 | 2 WAY RADIOS         |  17 |  18 |
+-------------+----------------------+-----+-----+

Вы захотите прочитать статью, с которой я связал понять это полностью, но я постараюсь дать краткое объяснение.

Элемент является членом другого элемента, если (дочернее "lft" - MP3-плееры
- Вспышка
- CD-плееры
- 2 Way Radio

У Джо Селко есть целая книга «Деревья и иерархии в SQL». Есть больше вариантов, чем вы думаете, но придется пойти на большой компромисс.

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

6
ответ дан 6 December 2019 в 07:51
поделиться

Если вам нужен действительно теоретически бесконечный уровень вложенности, то рекурсия - единственный вариант, который исключает любую разумную версию SQL. Если вы хотите его ограничить, есть ряд других вариантов.

Посмотрите этот вопрос .

0
ответ дан 6 December 2019 в 07:51
поделиться

Можете ли вы пояснить разницу между сущностью и пользователем? В противном случае ваши таблицы выглядят нормально. Вы делаете предположение, что между группами и сущностями существует связь «многие ко многим».

В любом случае, со стандартным SQL используйте этот запрос:

SELECT name, group_id
FROM entities JOIN group_members ON entities.id = group_members.entity_id;

Это даст вам список имен и group_ids, одну пару на строку. Если объект является членом нескольких групп, он будет указан несколько раз.

Если вам интересно, почему нет JOIN для таблицы групп, это потому, что нет данных из таблицы групп, которых еще нет в таблица group_members. Если вы включили, скажем, имя группы в таблицу групп и хотите, чтобы это имя отображалось, вам также придется присоединиться к группам.

В некоторых вариантах SQL есть команды, связанные с отчетностью. Они позволят вам перечислить несколько групп в одной строке как единое целое. Но это нестандартно и не будет работать на всех платформах.

1
ответ дан 6 December 2019 в 07:51
поделиться

Вы можете сделать следующее:

  • Используйте конструкции START WITH / CONNECT BY PRIOR .
  • Создайте функцию PL / SQL.
0
ответ дан 6 December 2019 в 07:51
поделиться

Я не думаю, что здесь нужна рекурсия, поскольку решение, опубликованное Барри-Брауном, кажется адекватным. Если вам нужна группа, чтобы быть членом группы, тогда хорошо работает метод обхода дерева, предлагаемый Демсом. С этой схемой вставки, удаления и обновления довольно просты, а получение всей иерархии выполняется с помощью одного выбора.

Я бы посоветовал включить поле parent_id в вашу таблицу group_members (при условии, что это точка, в которой возникают ваши рекурсивные отношения). В редакторе навигации я создал такую ​​таблицу узлов:

tbl_nodes     
----------
node_id   
parent_id 
left      
right
level

...

Мой редактор создает иерархически связанные объекты из класса узлов C #

    class node {
      public int NodeID { get; set; } 
      public Node Parent { get; set; }
      public int Left { get; set; }
      public int Right { get; set; }
      public Dictionary<int,Node> Nodes { get; set; } 
      public int Level {
         get { 
            return (Parent!=null) ? Parent.Level+1 : 1;
         }
      }
}

Свойство Nodes содержит список дочерних узлов. Когда бизнес-уровень загружает иерархию, он исправляет отношения родитель / потомок. Когда редактор навигации сохранит, Я рекурсивно устанавливаю значения свойств left и right, а затем сохраняю их в базе данных. Это позволяет мне выводить данные в правильном порядке, что означает, что я могу устанавливать родительские / дочерние ссылки во время извлечения вместо того, чтобы делать второй проход. Также означает, что все остальное, что необходимо для отображения иерархии (например, отчет), может легко получить список узлов в правильном порядке.

Без поля parent_id вы можете получить цепочку навигации к текущему узлу с помощью

select n1.* 
from nodes n1, nodes n2
where d1.lft <= d2.lft and d1.rgt >= d2.rgt
and d2.id = @id
order by lft;

], где @id - это идентификатор интересующего вас узла.

На самом деле довольно очевидный материал, но он применяется к таким элементам, как членство во вложенных группах, которое может быть неочевидным, и, как говорили другие, устраняет необходимость медленный рекурсивный SQL.

Это позволяет мне получать данные в правильном порядке, что означает, что я могу устанавливать родительские / дочерние ссылки во время поиска, вместо того, чтобы делать второй проход. Также означает, что все остальное, что необходимо для отображения иерархии (например, отчет), может легко получить список узлов в правильном порядке.

Без поля parent_id вы можете получить цепочку навигации к текущему узлу с помощью

select n1.* 
from nodes n1, nodes n2
where d1.lft <= d2.lft and d1.rgt >= d2.rgt
and d2.id = @id
order by lft;

], где @id - это идентификатор интересующего вас узла.

На самом деле довольно очевидный материал, но он применяется к таким элементам, как членство во вложенных группах, которое может быть неочевидным, и, как говорили другие, устраняет необходимость медленный рекурсивный SQL.

Это позволяет мне выводить данные в правильном порядке, что означает, что я могу устанавливать родительские / дочерние ссылки во время извлечения вместо того, чтобы делать второй проход. Также означает, что все остальное, что необходимо для отображения иерархии (например, отчет), может легко получить список узлов в правильном порядке.

Без поля parent_id вы можете получить цепочку навигации к текущему узлу с помощью

select n1.* 
from nodes n1, nodes n2
where d1.lft <= d2.lft and d1.rgt >= d2.rgt
and d2.id = @id
order by lft;

], где @id - это идентификатор интересующего вас узла.

На самом деле довольно очевидный материал, но он применяется к таким элементам, как членство во вложенных группах, которое может быть неочевидным и, как говорили другие, устраняет необходимость медленный рекурсивный SQL.

0
ответ дан 6 December 2019 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: