У меня есть две таблицы, которые я пытаюсь объединить на основе одного поля в SQL Server 2014, но проблема в том, что это единственное поле содержит значение, которое относится к одному из четырех «уровней», которые отображаются в отдельных столбцы в основной таблице. Поле SalesOrg
также является частью ключа, так как в транзакционной и поисковой таблицах может быть более одной торговой организации.
Вот основная транзакционная таблица:
SalesOrg PHLevel1 PHLevel2 PHLevel3 PHLevel4 SalesQty
-----------------------------------------------------------------------
AB1 Z000 Y000 X000 V000 20
AB1 Z000 Y000 X000 V001 30
AB1 Z001 Y000 X001 V001 10
AB1 Z001 Y001 X000 V003 45
AB1 Z001 Y001 X000 V004 48
AB1 Z002 Y003 X002 V005 67
Вот таблица поиска, которую я пытаюсь присоединить к транзакционной таблице:
SalesOrg PH PHLevel SalesRep
--------------------------------------------------
AB1 <null> 0 Mr. Pink
AB1 Z000 1 Mr. White
AB1 Z001 1 Mr. White
AB1 Z001Y000 2 Mr. Orange
AB1 Z001Y001 2 Mr. Orange
AB1 Z001Y001X000 3 Mr. Blonde
Итак, что должно произойти, это то, что «самое низкое» (то есть самое высокое PHLevel
, 3
) должно совпадать сначала, то есть :
SalesOrg PHLevel1 PHLevel2 PHLevel3 PHLevel4 SalesQty SalesRep
---------------------------------------------------------------------------------
AB1 Z000 Y000 X000 V000 20
AB1 Z000 Y000 X000 V001 30
AB1 Z001 Y000 X001 V001 10
AB1 Z001 Y001 X000 V003 45 Mr. Blonde
AB1 Z001 Y001 X000 V004 48 Mr. Blonde
AB1 Z002 Y003 X002 V005 67
Затем нам нужно сопоставить уровень 2, который еще не сопоставлен с использованием уровня 3:
SalesOrg PHLevel1 PHLevel2 PHLevel3 PHLevel4 SalesQty SalesRep
---------------------------------------------------------------------------------
AB1 Z000 Y000 X000 V000 20
AB1 Z000 Y000 X000 V001 30
AB1 Z001 Y000 X001 V001 10 Mr. Orange
AB1 Z001 Y001 X000 V003 45 Mr. Blonde
AB1 Z001 Y001 X000 V004 48 Mr. Blonde
AB1 Z002 Y003 X002 V005 67
Затем нам нужно сопоставить уровень 1, который еще не был сопоставляется с использованием уровня 2 или 3:
SalesOrg PHLevel1 PHLevel2 PHLevel3 PHLevel4 SalesQty SalesRep
---------------------------------------------------------------------------------
AB1 Z000 Y000 X000 V000 20 Mr. White
AB1 Z000 Y000 X000 V001 30 Mr. White
AB1 Z001 Y000 X001 V001 10 Mr. Orange
AB1 Z001 Y001 X000 V003 45 Mr. Blonde
AB1 Z001 Y001 X000 V004 48 Mr. Blonde
AB1 Z002 Y003 X002 V005 67
Наконец, для любых оставшихся элементов нам нужно проверить уровень 0, который является значением по умолчанию для «несопоставленных» записей:
SalesOrg PHLevel1 PHLevel2 PHLevel3 PHLevel4 SalesQty SalesRep
---------------------------------------------------------------------------------
AB1 Z000 Y000 X000 V000 20 Mr. White
AB1 Z000 Y000 X000 V001 30 Mr. White
AB1 Z001 Y000 X001 V001 10 Mr. Orange
AB1 Z001 Y001 X000 V003 45 Mr. Blonde
AB1 Z001 Y001 X000 V004 48 Mr. Blonde
AB1 Z002 Y003 X002 V005 67 Mr. Pink
It Нет проблем, если в транзакционной таблице создается объединенное поле, чтобы упростить сопоставление с таблицей поиска.
Я не уверен, что было бы выгодно расширить таблицу поиска так, чтобы поле PH
содержит «полностью квалифицированные» значения (т.е. так что PH
всегда содержит PHLevel1
/ PHLevel2
/ PHLevel3
/ PHLevel4
значений, например, Z001Y000X001V001
), но это может сделать таблицу поиска огромной, а затем, возможно, замедлить соединение (так как транзакционная таблица может содержать, возможно, миллион строк).
Я не уверен, как начать с этого, так как я видел другие примеры с иерархиями, но таблица поиска не является точно иерархией - есть ли элегантные решения в SQL пожалуйста?