Не зная схемы вашей таблицы или вашего 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
. . Я уверен, что этот общий подход будет работать, если ваши данные будут такими, как я предполагал, но несовершенными данными потребовал бы более надежного запроса, чем приведенный здесь пример.
Если вы можете поделиться более подробной информацией о вашей конкретной схеме, я был бы рад отредактировать предложенный запрос в соответствии с вашей ситуацией.