2016-09-10 3 views
0

Я использую базу данных, которая, на мой взгляд, не была настроена самым интуитивно понятным способом. У меня есть две таблицы, к которой я пытаюсь присоединиться. Таблица магазинов содержит информацию о магазине и имеет поле store_id, которое хранится как 7-значное число в формате varchar. В таблице транзакций есть поле transaction_id, которое настроено как hstore и хранится как «package_id» => «10000417». Я пытаюсь присоединиться к двум таблицам в этих полях.Изменение типов данных и использование LIKE в LEFT OUTER JOIN

Я попытался указать поле transaction_id как varchar, в то же время попытался использовать подзапрос в заявлении объединения, чтобы добавить часть package_id => в поле store_id. пытались использовать LIKE в JOIN заявление, чтобы добавить символы Тем не менее проблемы Вот код, который я пытался при использовании LIKE:..

SELECT t.amount 
    ,t.quantity_sold 
    ,t.unit 
    ,cast(t.transaction_details as varchar) as join_field 
    ,s.product_name 
    ,s.product_category 
    ,s.metrc_id 
FROM transactions t 
LEFT JOIN store_info s ON t.transaction_details = s.store_id 
WHERE t.transaction_details LIKE '%store_id%' 

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

Заранее благодарен,

EDIT

Я использую SQL Server, а не Postgresql. С тех пор я сделал больше исследований по типу данных hstore и немного понял его. У меня все еще есть проблемы с присоединением к двум таблицам. Мне удалось создать новый столбец только с идентификационным номером, используя следующий запрос.

SELECT *, transaction_details->'package_id' as ID 
FROM transactions 

Я попытался соединим затем вызвать этот столбец не дало никаких результатов, поэтому я попытался следующее:

SELECT * 
FROM transactions t 
LEFT JOIN store_info s ON t.transaction_details->'package_id' = s.store_id 

Я также попытался бросить в целое или VARCHAR, используя следующие

SELECT * 
FROM transactions t 
LEFT JOIN store_info s ON cast(t.transaction_details->'package_id' 
as varchar) = s.store_id 

Извините за то, что вы такой noob. Спасибо за помощь.

ответ

0

Ваш код не работает по двум причинам.

  1. Идентификатор магазина и сведения о транзакции не соответствуют вашим описаниям значений в этих столбцах.
  2. Шаблон like - это просто строка, которая выглядит как '%store_id%'. Значение столбца не указано в строке (см. Ниже, как это сделать).

Вам нужно что-то вроде этого:

SELECT . . . 
FROM transactions t LEFT JOIN 
    store_info s 
    ON t.transaction_details LIKE '%' || s.store_id || '%'; 

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

 ON t.transaction_details LIKE '%' || s.store_id 

или:

 ON t.transaction_details LIKE s.store_id || '%' 

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