Выбор значения, в котором имя совпадает со значением, а имя совпадает с другим значением в запросе «многие в одну временную таблицу» - PullRequest
0 голосов
/ 17 апреля 2019

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

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 Ответ

0 голосов
/ 17 апреля 2019

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

рабочий код:

    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')
            );

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...