Объявление

Свернуть
Пока нет объявлений.

Путь папки SQL-запросом

Свернуть
X
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • Путь папки SQL-запросом

    Запрос для MS SQL Server возвращает:
    • идентификатор папки;
    • имя таблицы БД (если есть, иначе NULL);
    • алиас папки (если есть, иначе NULL);
    • имя папки (в серверном языке);
    • путь папки (в серверном языке).
    В качестве view удобно использовать в других запросах.
    Код:
    --CREATE VIEW [dbo].[v_FolderPath] AS
    WITH FolderHierarchy([FolderId], [FolderName], [FolderAlias], [ParentId], [FolderPath]) AS (
    SELECT [id], [name], [alias], [parent], CAST('' AS VARCHAR(MAX))
    FROM [dbo].[ProblemArea] WHERE [parent] = 2147483647    
    UNION ALL
    SELECT RS2.[id], RS2.[name], RS2.[alias], Parent.[FolderId]
    ,CAST(CASE
          WHEN Parent.[FolderPath] = ''
          THEN(CAST(RTRIM(Parent.[FolderName]) AS VARCHAR(MAX)))
          ELSE(Parent.[FolderPath] + '\' + CAST(RTRIM(Parent.[FolderName]) AS VARCHAR(MAX)))
          END AS VARCHAR(MAX))
    FROM [dbo].[ProblemArea] AS RS2
    INNER JOIN FolderHierarchy AS Parent ON RS2.[parent] = Parent.[FolderId])
    SELECT [FolderId]
    ,RTTD.[tabname] AS 'TableName'
    ,CASE WHEN [FolderAlias] = ''
          THEN NULL
          ELSE [FolderAlias]
          END AS 'FolderAlias'
    ,[FolderName]
    ,CASE WHEN [ParentId] = 2147483647
          THEN [FolderName]
          ELSE [FolderPath] + '\' + [FolderName]
          END AS 'FolderPath'
    FROM FolderHierarchy
    LEFT JOIN [dbo].[RunTimeTableDef] RTTD ON 'UserFields' + CAST([FolderId] AS NCHAR(7)) = RTTD.[tabname]
    --GO
    --SELECT * FROM [dbo].[v_FolderPath] ORDER BY 5
    С уважением, Сергей Осадчий

  • #2
    Для Oracle

    Иерархия папок:
    Код:
    WITH folder AS
     (SELECT LPAD(' ', 6 * LEVEL - 1) || pa.name AS folder_name,
             LPAD(' ', 6 * LEVEL - 1) || pa.alias AS folder_alias,
             pa.id,
             SYS_CONNECT_BY_PATH(TRIM(pa.name), '/' ) AS path_to_dir
        FROM problemarea pa
       START WITH pa.name = &<name="Table_name" list="SELECT pa.name, pa.* from problemarea pa WHERE pa.parent = 2147483647 ORDER BY pa.name "  type="string" >
      CONNECT BY PRIOR pa.id = pa.parent)
    SELECT f.*, ut.TABLE_NAME
      FROM folder f
      LEFT JOIN user_tables ut
        ON ut.TABLE_NAME = 'USERFIELDS' || TO_CHAR(f.id)
    Узнать какая колонка в %userfields% отвечает за какое поле:
    Код:
    SELECT  UPPER(rt.tabname) AS folder,
          ufd.id,
          ufd.label,
          REPLACE(ufd.alias,' ', '') as "alias",
          UPPER(rf.fieldname) AS fieldname,
          refobj_key AS ref_folder
     FROM runtimetabledef rt
    INNER JOIN runtimefielddef rf
       ON rf.tab_id = rt.id
    LEFT JOIN userfielddef ufd
       ON ufd.run_time_field = rf.id
      WHERE upper(rt.tabname) =  &<name="Table_name" list="select ut.TABLE_NAME, pa.name from user_tables ut
                                                                                                JOIN problemarea pa ON pa.id =  TO_NUMBER(REGEXP_SUBSTR(ut.TABLE_NAME , '\d+'))
                                                                                                WHERE ut.TABLE_NAME LIKE 'USERFIELDS%'
                                                                                                ORDER BY pa.name"
                                                      description="yes"
                                                      type="string" >
    ORDER BY folder, ufd.label;
    * "pa.name = &<name=...." работает в PL/SQL Developer, в других редакторах нужно подставлять вручную.

    Комментарий

    Обработка...
    X