Справка SQL - присоединиться к небольшой справочной таблице, где требуются не все столбцы (и другой вариант) - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть одна большая таблица с транзакциями и меньшая таблица поиска со значениями, которые я хочу добавить на основе 4 общих столбцов.Суть в том, что не каждая комбинация этих 4 столбцов будет существовать в таблице поиска, и есть сценарии, в которых я хочу, чтобы он прекратил проверку и принял совпадение вместо перехода к следующему столбцу.У меня также есть опция «Другое», по умолчанию, если она не соответствует ни одной из опций.

Структуры таблиц выглядят примерно так:

transaction_table
country, trans_id, store_type, store_name, channel, browser, purchase_amount, currency

lookup_table
country, store_name, channel, browser, trans_fee

Данные могут быть примерно такими:this:

transaction_table:

country| trans_id| store_type  |store_name  |channel |browser |amt  |currency
US     | 001     | Big Box     | Target     | B&M    |N/A     |1.45 |USD    
US     | 002     | Big Box     | Target     | Online |Chrome  |1.79 |USD   
US     | 003     | Small       | Bob's Store| B&M    |N/A     |2.50 |USD   
US     | 004     | Big Box     | Walmart    | B&M    |N/A     |1.12 |USD   
US     | 005     | Big Box     | Walmart    | Online |Firefox |3.79 |USD   
US     | 006     | Big Box     | Amazon     | Online |IE      |4.54 |USD   
US     | 007     | Small       | Jim's Plc  | B&M    |IE      |2.49 |USD 

lookup_table:
country|store_name  |channel |browser |trans_fee
US     |Target      |B&M     |N/A     |0.25   
US     |Target      |Online  |        |0.15
US     |Walmart     |        |        |0.30
US     |Other       |        |        |0.45

Итак, глядя на данные lookup_table:

  • Строка 1 очень специфична и будет соответствовать всем 4 столбцам соединения.
  • Ряд 2 не будет заботиться о том, какой браузер использовался для покупок в Target, поэтому независимо от значения «браузер» trans_fee должен возвращаться одинаково (хотя другие магазины могут заботиться об этом).
  • Ряд3 говорит, что любая транзакция со страной = 'US' и store_name = 'Walmart', независимо от того, будут ли остальные столбцы объединения иметь одинаковый trans_fee
  • Строка 4 - это «другой» сценарий, в котором она должнаСначала посмотрите на столбец store_name и, если он не находит соответствия, перейдите к Other.

Данные lookup_table могут измениться и могут оказаться зависимыми от времени (добавлены столбцы start_date и end_date), поэтомудействительно не был бы хорошим кандидатом для длинного, сложного оператора CASE.

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

Спасибо!

edit: я не указал это, но я хочу в основном вернуть все данные изaction_table и добавить соответствующий trans_fee в каждую строку.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Такое частичное совпадение сложно.И ваша проблема не очень хорошо решена.Кажется, у вас есть NULL s в некоторых столбцах и общие значения в других.

В любом случае вы можете решить эту проблему, сопоставив то, что можете, а затем используя order by, чтобы получить наилучшее совпадение.В вашем случае, я думаю, это выглядит так:

select tt.*,
       (select trans_fee
        from lookup l
        where l.country = tt.country and
              l.store_name in ('other', tt.store_name) and
              (l.channel = tt.channel or l.channel is null) and
              (l.browser = tt.browser or l. browser is null)
        order by (case when l.store_name = tt.store_name then 1 else 2 end),
                 (case when l.channel = tt.channel then 1 else 2 end),
                 (case when l.browser = tt.browser then 1 else 2 end)
        fetch first 1 row only
       ) as trans_fee
from transaction_table tt;

Это общий SQL.Но та же идея должна работать в любой базе данных.

0 голосов
/ 07 февраля 2019

Вам нужно будет использовать условное JOIN.

Как-то так

SELECT * 
FROM lookup_table
LEFT OUTER JOIN transaction_table
ON CASE WHEN lookup_table.store_name IS NOT NULL 
THEN transacton_table.store_name = lookup_table.store_name END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...