Mysql - XML как таблица с несколькими значениями в одном столбце - PullRequest
0 голосов
/ 24 апреля 2020

Название моего вопроса сбивает с толку, извините за это.

У меня есть одно приложение, которое сохраняет данные в базе данных в формате XML 'i sh, ссылаясь на ключи и значения. Проблема в том, что у меня есть только один столбец с несколькими значениями, которые соответствуют определенному ключу.

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

Ниже Пример таблицы у меня есть

xml_type    | xml_key | xml_content_key                                      | xml_content_value
----------------------------------------------------------------------------------------------------
Archiv::144 | 144     | [1]{'Version'}[1]{'Carrier'}[1]{'Content'}           | 151
Archiv::144 | 144     | [1]{'Version'}[1]{'CarrierID'}[1]{'Content'}         | 5714141614
Archiv::144 | 144     | [1]{'Version'}[1]{'CustomerInterface'}[1]{'Content'} | 145

Итак, я могу запустить это и иметь все носители:

select xml_content_key as Carrier, xml_content_value as 'Carrier Result'
from xml_storage xs where xml_content_key LIKE '%[1]{\'Version\'}[1]{\'Carrier\'}[1]{\'Content\'}%'

Но как бы мне показывать другие ключи из столбца xml_content_key как столбцы , Я пробовал вложенные выборки, но получил «Возвращает более одного значения», объединение не будет применяться, так как это для одной таблицы.

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

Спасибо.

1 Ответ

1 голос
/ 24 апреля 2020

Не зная схемы вашей таблицы или вашего XML документа, мне придется сделать некоторые предположения. Но я думаю, что это не так уж сложно. Сначала я напишу мои предположения. Пожалуйста, исправьте меня, если эти предположения неверны.

Похоже, у вас есть таблица, в которой xml_content_key - это то, что должно быть именем столбца, а xml_key - это то, что должно быть идентификатором строки. Вы только показали очень ограниченную выборку в своем вопросе, но я предполагаю, что больше данных может выглядеть следующим образом.

xml_type    | xml_key | xml_content_key                                      | xml_content_value
----------------------------------------------------------------------------------------------------
Archiv::144 | 144     | [1]{'Version'}[1]{'Carrier'}[1]{'Content'}           | 151
Archiv::144 | 144     | [1]{'Version'}[1]{'CarrierID'}[1]{'Content'}         | 5714141614
Archiv::144 | 144     | [1]{'Version'}[1]{'CustomerInterface'}[1]{'Content'} | 145
Archiv::144 | 145     | [1]{'Version'}[1]{'Carrier'}[1]{'Content'}           | 123
Archiv::144 | 145     | [1]{'Version'}[1]{'CarrierID'}[1]{'Content'}         | 4567891234
Archiv::144 | 145     | [1]{'Version'}[1]{'CustomerInterface'}[1]{'Content'} | 567
Archiv::144 | 146     | [1]{'Version'}[1]{'Carrier'}[1]{'Content'}           | 891
Archiv::144 | 146     | [1]{'Version'}[1]{'CarrierID'}[1]{'Content'}         | 2345678912
Archiv::144 | 146     | [1]{'Version'}[1]{'CustomerInterface'}[1]{'Content'} | 345

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

+---------+---------+------------+-------------------+
| xml_key | Carrier | CarrierID  | CustomerInterface |
+---------+---------+------------+-------------------+
|     144 |     151 | 5714141614 |               145 |
|     145 |     123 | 4567891234 |               567 |
|     146 |     891 | 2345678912 |               345 |
+---------+---------+------------+-------------------+

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

объединение не будет применяться, так как это на одном столе.

Вы пропали без вести замечательная функция SQL: self join чрезвычайно полезны в подобных случаях.

Похоже, что для каждого * 1029 есть три «ключа содержимого» (или столбца) * (или строка). Мы объединим все xml_content_key, которые имеют один и тот же xml_key, так что каждая строка будет описывать один xml_key. Кстати, я предполагаю, что ваша таблица называется xml_storage.

SELECT xs1.xml_key AS 'xml_key',
       xs1.xml_content_value AS 'Carrier',
       xs2.xml_content_value AS 'CarrierID',
       xs3.xml_content_value AS 'CustomerInterface'
FROM       xml_storage xs1
INNER JOIN xml_storage xs2 ON xs2.xml_key = xs1.xml_key
INNER JOIN xml_storage xs3 ON xs3.xml_key = xs1.xml_key
WHERE  xs1.xml_content_key LIKE "%[1]{'Version'}[1]{'Carrier'}[1]{'Content'}%"
   AND xs2.xml_content_key LIKE "%[1]{'Version'}[1]{'CarrierID'}[1]{'Content'}%"
   AND xs3.xml_content_key LIKE "%[1]{'Version'}[1]{'CustomerInterface'}[1]{'Content'}%"

Основная идея c заключается в том, что мы разделяем таблицу на три таблицы, а затем соединяем их вместе. Мы помещаем Carrier в xs1, CarrierID в xs2, а CustomerInterfaces в xs3. Затем мы объединяем их вместе, помещая весь контент, связанный с конкретным xml_key, в одну строку.

Возможно, вам придется изменить это, чтобы соответствовать вашей фактической схеме. В частности, этот запрос предполагает, что у вас есть только один Carrier, CarrierID и CustomerInterface на уникальный xml_key. . Я уверен, что этот общий подход будет работать, если ваши данные будут такими, как я предполагал, но несовершенными данными потребовал бы более надежного запроса, чем приведенный здесь пример.

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

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