Выберите результат подзапроса, когда внешний запрос обнуляется - PullRequest
0 голосов
/ 26 декабря 2018

Я использую postgres 9.4.У меня есть две таблицы tblcomponent и tblprofile без ссылки на внешний ключ.

Я хочу выбрать данные из обеих таблиц.Отношение выглядит так:

tblcomponent -> tblprofile

Если требуемые данные не найдены в tblprofile, то должны быть выбраны только данные tblcomponent.Если сам tblcomponent не содержит запрошенных данных, то данные не нужно извлекать.

Запрос:

SELECT subquery1.pk_szid, subquery1.xmldata, tblprofile.pk_szid, tblprofile.xmldata
FROM tblprofile,
 (SELECT tblcomponent.pk_szid, tblcomponent.xmldata 
  FROM tblcomponent WHERE pk_szid != 'DEFAULT' ) subquery1
WHERE  
CAST((xpath('/Profile/ComponentIDs/ComponentID[@Family="Flow"]/text()', tblprofile.xmldata))[1] AS TEXT) = subquery1.pk_szid

Приведенный выше запрос возвращает, если данные существуют в обеих таблицах.Как получить данные из subquery1 при внешнем запросе, т. Е. При сбое предложения where?

Например:

tblcomponent:

| pk_szid | xmldata        |
+---------+----------------+
| a1      |  xmldata       |
| a2      |  xmldata       |
| a3      |  xmldata       |

tblprofile:

| pk_szid | xmldata        |
+---------+----------------+
| b1      |  xmldata       | // contains a1
| b2      |  xmldata       | // does not contain any of tblcomponent.pk_szid

Здесь xmldata записи 'b1' содержит tblcomponent.pk_szid.Когда я даю 'a1', результат для вышеупомянутого запроса будет:

| pk_szid      | xmldata     |   pk_szid    |  xmldata     |
+--------------+-------------+--------------+--------------+
| a1           | xmldata     |     b1       |   xmldata    |

Когда я даю 'a2',

  | pk_szid      | xmldata     |   pk_szid    |  xmldata     |
  +--------------+-------------+--------------+--------------+

Я хочу что-то вроде,

 | pk_szid      | xmldata     |   pk_szid    |  xmldata     |
 +--------------+-------------+--------------+--------------+
 | a2           | xmldata     |              |              |

Как получить это из subquery1?

1 Ответ

0 голосов
/ 26 декабря 2018

Попробуйте реорганизовать ваш внешний запрос и подзапрос в отдельные CTE, затем присоедините их слева:

WITH cte1 AS (
    SELECT pk_szid, xmldata,
        CAST((xpath('/Profile/ComponentIDs/ComponentID[@Family="Flow"]/text()', xmldata))[1] AS TEXT) AS xml_content
    FROM tblprofile
),
cte2 AS (
    SELECT pk_szid, xmldata 
    FROM tblcomponent
    WHERE pk_szid != 'DEFAULT'
)

SELECT
    t2.pk_szid,
    t2.xmldata,
    t1.pk_szid,
    t1.xmldata
FROM cte1 t1
LEFT JOIN cte2 t2
    ON t1.xml_content = t2.pk_szid;

Существует несколько вариантов вышеупомянутого, которые мы могли бы написать, но основная идея состоит в том, чтобы вычислить значение XPathв предложении выбора, а затем оставил соединение, используя это значение.Левое объединение предотвращает возможность удаления записей.

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