Случай, когда используется для определения типа - PullRequest
0 голосов
/ 19 июня 2019

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

Я создаю веб-страницу, которая показывает вам OrgStructure. Чтобы упростить вещи, я хочу раскрасить вещи в зависимости от типа записи. Если это подразделение, я хочу, чтобы оно было зеленым, юниты - красным и так далее. Я подумал об использовании CASE WHEN и LEFT JOIN с разными таблицами, чтобы «найти совпадение», а затем установить тип. Есть мысли и идеи? В приведенном ниже коде вы видите мою отправную точку. Это показывает мне различные записи в структуре и на каком уровне. Но несколько разных вещей могут относиться ко мне на одном уровне, поэтому я также хочу определить тип.

SELECT ID
        ,BelongTo_ID
        ,Name
        ,IdPath
        ,LEN(IdPath) - LEN(REPLACE(IdPath, '/', '')) AS Level
        ,CASE WHEN EXISTS (SELECT * FROM dbo.atbl_Common_Orgstructure WITH(NOLOCK) WHERE BelongTo_ID = OS.ID) 
            THEN 0 ELSE 1 END AS IsEndpoint
FROM dbo.atbl_Common_Orgstructure OS WITH(NOLOCK)

У меня есть рабочее представление со структурой org, но теперь я хочу установить тип. Я хочу установить тип в зависимости от того, в какой таблице найдена запись. Если он найден в таблице «Подразделения», задайте тип «1», если он найден в таблице «Единицы измерения», установите тип «2» и т. Д.

Пример записей:

Sample Records

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Предполагается, что запись будет только один раз в одной из таблиц ....

;WITH cte_Common_Types AS (
    SELECT 'Division' AS TypeName, 'Green' AS TypeColor, ID
    FROM atbl_Common_Divisions
    UNION ALL
    SELECT 'Unit' AS TypeName, 'Red' AS TypeColor, ID
    FROM atbl_Common_Units
)
SELECT 
    ID
    ,BelongTo_ID
    ,Name
    ,IdPath
    ,LEN(IdPath) - LEN(REPLACE(IdPath, '/', '')) AS Level
    ,CASE WHEN EXISTS (SELECT 1 FROM dbo.atbl_Common_Orgstructure WITH(NOLOCK) WHERE BelongTo_ID = OS.ID) 
            THEN 0 ELSE 1 END AS IsEndpoint
    ,TypeName
    ,TypeColor
FROM dbo.atbl_Common_Orgstructure OS WITH(NOLOCK)
LEFT JOIN cte_Common_Types CT ON OS.ID = CT.ID
0 голосов
/ 19 июня 2019

Вы можете использовать LEFT JOIN и CASE / WHEN, как показано ниже -

SELECT ID
,BelongTo_ID
,Name
,IdPath
,LEN(IdPath) - LEN(REPLACE(IdPath, '/', '')) AS Level
,CASE 
    WHEN  A.BelongTo_ID IS NOT NULL  THEN 'Red'
    WHEN  B.<related column> IS NOT NULL  THEN 'Green'
    WHEN  C.<related column> IS NOT NULL  THEN 'Blue'
    ELSE 1 
END AS IsEndpoint
FROM dbo.atbl_Common_Orgstructure OS WITH(NOLOCK)
LEFT JOIN (
    SELECT DISTINCT BelongTo_ID FROM dbo.atbl_Common_Orgstructure WITH(NOLOCK)
) A ON OS.ID  =  A.BelongTo_ID

LEFT JOIN (
    ...
) B ON OS.ID  =  B.<related column>

LEFT JOIN (
    ...
) C ON OS.ID  =  C.<related column>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...