SQL рекурсивный запрос к самореференсной таблице (Oracle)

Другие продемонстрировали, как буквально перевести event+= в AddHandler в VB.

Однако, несмотря на сходство, VB и C # - разные языки, а хороший код C # может быть не очень хорошим кодом VB при переводе буквально. Например, в VB канонический способ привязки фиксированного обработчика событий к элементу управления ASP.NET использует ключевое слово Handles:

Protected Sub AsyncFileUpload1_UploadedComplete(sender As Object, _
                                                e As AsyncFileUploadEventArgs) _
    Handles AsyncFileUpload1.UploadedComplete

    ' Your event handler code is here

End Sub
30
задан Cœur 11 December 2017 в 03:43
поделиться

3 ответа

Использовать:

    SELECT t1.id, 
           t1.parent_id, 
           t1.name,
           t2.name AS parent_name,
           t2.id AS parent_id
      FROM tbl t1
 LEFT JOIN tbl t2 ON t2.id = t1.parent_id
START WITH t1.id = 1 
CONNECT BY PRIOR t1.id = t1.parent_id
36
ответ дан 27 November 2019 в 20:32
поделиться

Вы хотите это сделать? ?

SELECT id, parent_id, name, 
 (select Name from tbl where id = t.parent_id) parent_name
FROM tbl t start with id = 1 CONNECT BY PRIOR id = parent_id

Edit Другой вариант, основанный на варианте OMG (но я думаю, что он будет работать одинаково):

select 
           t1.id, 
           t1.parent_id, 
           t1.name,
           t2.name AS parent_name,
           t2.id AS parent_id
from 
    (select id, parent_id, name
    from tbl
    start with id = 1 
    connect by prior id = parent_id) t1
    left join
    tbl t2 on t2.id = t1.parent_id
2
ответ дан 27 November 2019 в 20:32
поделиться

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

Вы можете сделать это без вложенности select, но я считаю, что это немного чище, чем четыре ссылки на SYS_CONNECT_BY_PATH.

select id, 
       parent_id, 
       case 
         when lvl <> 1 
         then substr(name_path,
                     instr(name_path,'|',1,lvl-1)+1,
                     instr(name_path,'|',1,lvl)
                      -instr(name_path,'|',1,lvl-1)-1) 
         end as name 
from (
  SELECT id, parent_id, sys_connect_by_path(name,'|') as name_path, level as lvl
  FROM tbl 
  START WITH id = 1 
  CONNECT BY PRIOR id = parent_id)
0
ответ дан 27 November 2019 в 20:32
поделиться
Другие вопросы по тегам:

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