Лучший способ объединить разные таблицы в MySQL в зависимости от условия? - PullRequest
2 голосов
/ 28 апреля 2020

У меня есть следующие таблицы:

Licenses:

 License    |    object_type_id  |  selected_object_type_id  
  L1                   1                     300 
  L4                   2                     300
  L5                   3                     127 
  ..                   ..                    ...

object_type

id    |    type  |
1          Main
2          Sub
3          Feature

Main

id   | product  | ....
1        PMA
2        PMB
3        PMC
...       ...
300       PMZZ

Sub

id  | product | ...
1       PSA1
2       PSA2
3       ...
300     PSAZZ

Feature

id  |  Feature|  ...
1        FO1
2        FO2
3        FO3
..        ..
127       FFZ127

Я хочу иметь финальную таблицу с именем "license_mapping"

license_mapping

 license   |   license_object | license_object_type
   L1              PMZZ              Main
   L4              PSAZZ             Sub
   L5              FFZ127            Feature

В логе c указывается, что для данной лицензии найдите licenses.object_type_id. В зависимости от значения object_type.type, где licenses.object_type_id = object_type.id выберите продукт или функцию из соответствующей таблицы, которая соответствует licenses.selected_object_type_id.

Но как мне обращаться с кейсами Main и Sub, поскольку они имеют с тем же идентификатором, а также с тем же именем столбца?

Если я напишу псевдо SQL заявление, это будет следующим: последняя строка, где я не понимаю, как это сделать правильно.

 SELECT
   L.License,
   CASE WHEN OT.type = 'Main' THEN M.Product WHEN OT.type = 'Sub' THEN S.Product WHEN OT.Type = 'Feature' THEN F.Feature END AS License_Objects,
   OT.type As license_object_type
 FROM 
   Licenses L
   JOIN object_type OT on L.object_type_id = OT.id
   JOIN Feature F on L.object_type_id = F.id
   JOIN Main M when OT.type = 'Main' and Sub S when OT.type = 'Sub'

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Вам просто нужно LEFT JOIN для каждой из таблиц Main, Sub и Feature на значении selected_object_type_id и выбрать соответствующее значение из этих таблиц на основе object_type:

SELECT l.License, 
       CASE WHEN ot.type = 'Main' THEN m.product 
            WHEN ot.type = 'Sub' THEN s.product
            WHEN ot.type = 'Feature' THEN f.Feature
       END AS license_object,
       ot.type AS license_object_type
FROM licenses l
JOIN object_type ot ON ot.id = l.object_type_id
LEFT JOIN main m ON m.id = l.selected_object_type_id
LEFT JOIN sub s ON s.id = l.selected_object_type_id
LEFT JOIN feature f ON f.id = l.selected_object_type_id
ORDER BY l.License

Вывод данных для примера:

License     license_object  license_object_type
L1          PMZZ            Main
L4          PSAZZ           Sub
L5          FFZ127          Feature

Демонстрация на dbfiddle

0 голосов
/ 28 апреля 2020

Вы можете использовать два JOIN с Main. Тем не менее, предположительно, есть также условие для id - и неясно, к чему это должно быть JOIN ed:

 SELECT L.License,
        (CASE WHEN OT.type = 'Main' THEN MS.Product
              WHEN OT.type = 'Sub' THEN MS.Product
              WHEN OT.Type = 'Feature' THEN F.Feature
         END) AS License_Objects,
        OT.type As license_object_type
FROM Licenses L JOIN
     object_type OT
     ON L.object_type_id = OT.id JOIN
     Feature F 
     ON L.object_type_id = F.id LEFT JOIN
     Main MM
     ON MM.ID = ??? AND OT.type = 'Main' LEFT JOIN
     MAIN MS 
     ON MS.ID = ??? AND OT.type = 'Sub';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...