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

#sql #mariadb

#sql #mariadb

Вопрос:

Я пытаюсь создать новый параметр поиска для инструмента отслеживания активов и использую две временные таблицы, которые объединяются и запрашиваются, поскольку активы могут иметь более одного программного обеспечения, которое мне нужно, и условное, которое найдет только те, у которых есть…значение в них привязано к любому имени, но отфильтруйте те потенциальные совпадения, которые больше не совпадают: в данном случае программное обеспечение.Я знаю, что, должно быть, делаю что-то не так, но я просто не могу этого увидеть… Ниже приведен код, используемый для создания временных таблиц, используемых позже при поиске…

 CREATE TEMPORARY TABLE lookup_tbl_2 SELECT am_software.id,
            am_software.asset_name,
            am_software.sw_name,
            am_software.sw_key,
            am_software.sw_osver
        FROM am_software
        UNION ALL
        SELECT am_software_archive.id,
            am_software_archive.asset_name,
            am_software_archive.sw_name,
            am_software_archive.sw_key,
            am_software_archive.sw_osver
        FROM am_software_archive;

CREATE TEMPORARY TABLE lookup_tbl_1 SELECT am_assets.id,
            am_assets.asset_name,
            am_assets.asset_family,
            am_assets.asset_type,
            am_assets.asset_location,
            am_assets.asset_manufacturer,
            am_assets.asset_model,
            am_assets.asset_serial,
            am_assets.asset_status,
            am_assets.asset_retired_on,
            am_networks.connection_type,
            CASE WHEN am_networks.ipa_pointer = 1 THEN 'Dynamic' ELSE CONCAT_WS('.', am_ip_addresses.ip_address, am_networks.ip_address) END AS 'display_address'
        FROM am_assets
        JOIN am_networks ON am_assets.asset_name = am_networks.asset_name
        JOIN am_locations ON am_assets.asset_location = am_locations.id
        JOIN am_asset_family ON am_assets.asset_family = am_asset_family.id
        JOIN am_asset_type ON am_assets.asset_type = am_asset_type.id
        JOIN am_ip_addresses ON am_networks.ipa_pointer = am_ip_addresses.id
        JOIN am_connection_types ON am_networks.connection_type = am_connection_types.id
        UNION ALL
        SELECT am_asset_archive.id,
            am_asset_archive.asset_name,
            am_asset_archive.asset_family,
            am_asset_archive.asset_type,
            am_asset_archive.asset_location,
            am_asset_archive.asset_manufacturer,
            am_asset_archive.asset_model,
            am_asset_archive.asset_serial,
            am_asset_archive.asset_status,
            am_asset_archive.asset_retired_on,
            am_network_archive.connection_type,
            CASE WHEN am_network_archive.ipa_pointer = 1 THEN 'Dynamic' ELSE CONCAT_WS('.', am_ip_addresses.ip_address, am_network_archive.ip_address) END AS 'display_address'
        FROM am_asset_archive
        JOIN am_network_archive ON am_asset_archive.asset_name = am_network_archive.asset_name
        JOIN am_locations ON am_asset_archive.asset_location = am_locations.id
        JOIN am_asset_family ON am_asset_archive.asset_family = am_asset_family.id
        JOIN am_asset_type ON am_asset_archive.asset_type = am_asset_type.id
        JOIN am_ip_addresses ON am_network_archive.ipa_pointer = am_ip_addresses.id
        JOIN am_connection_types ON am_network_archive.connection_type = am_connection_types.id;
 

Опять же, цель состоит в том, чтобы выполнить поиск по временным таблицам и вернуть значения в пользовательский интерфейс; так что здесь у меня возникают проблемы:

     SELECT lookup_tbl_1.asset_name as 'asset_name' 
    FROM lookup_tbl_1 
    JOIN lookup_tbl_2 
    ON lookup_tbl_1.asset_name = lookup_tbl_2.asset_name 
    WHERE lookup_tbl_2.sw_name LIKE 'Office 2010' AND lookup_tbl_2.sw_name LIKE 'Atom'
    AND lookup_tbl_1.asset_location = 5;
 

Имена программного обеспечения являются текстовыми и не должны иметь подобного, но даже когда я использую:

     SELECT lookup_tbl_1.asset_name as 'asset_name' 
    FROM lookup_tbl_1 
    JOIN lookup_tbl_2 
    ON lookup_tbl_1.asset_name = lookup_tbl_2.asset_name 
    WHERE lookup_tbl_2.sw_name = 'Office 2010' 
    AND lookup_tbl_2.sw_name = 'Atom'
    AND lookup_tbl_1.asset_location = 5;
 

Известно, что значения привязаны к определенному активу, который я пытаюсь отобразить для отображения имени активов, это работает, если я отбрасываю одно из условий имени программного обеспечения (sw_name), но не тогда, когда их больше одного…

Я искал рабочее решение и пробовал такие вещи, как:

 WHERE lookup_tbl_2.sw_name LIKE 'Office 2010' AND 'Atom'
 
 WHERE lookup_tbl_2.sw_name LIKE 'Office 2010' 'Atom'
 
 WHERE lookup_tbl_2.sw_name = 'Office 2010' AND 'Atom'
 
 WHERE (find_in_set('Office 2010', lookup_tbl_2.sw_name)>0 AND find_in_set('Atom', lookup_tbl_2.sw_name)>0)
 

все возвращают один и тот же пустой результат, но удаление второго условного обозначения sw_name работает нормально…

Ожидаемый: должен возвращать список имен активов, таких как ‘JWW90120’ (фактическое значение имени актива, которое должно быть включено в ожидаемый список, поскольку оно соответствует всем условным обозначениям).

Фактически: пустые результаты.

Ответ №1:

Я получил некоторую помощь от коллеги, который помог мне работать, хотя после устранения нескольких ошибок мы, наконец, заставили его работать…

рабочий код:

     SELECT lookup_tbl_1.asset_name FROM lookup_tbl_1 WHERE lookup_tbl_1.asset_location = 5 
        AND EXISTS (
            SELECT lookup_tbl_2.asset_name FROM lookup_tbl_2 WHERE
                lookup_tbl_1.asset_name = lookup_tbl_2.asset_name AND
                lookup_tbl_2.sw_name in ('Office 2010', 'Atom')
            );
 

Эта проблема решена… Надеюсь, это поможет кому-то еще, кто может оказаться в подобной ситуации в будущем.

Комментарии:

1. Для AND операции было обнаружено, что использование GROUP BY table_name.primary_key HAVING COUNT(DISTINCT table_name.column_searched) = num_vals_in_IN работало для исключения того, где значения не все существуют в активе по имени. * отредактировано для структуры.