Как объединить таблицу по столбцу со значениями, разделенными тильдой - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь сопоставить коды / описания от table_2 для каждой компании в table_1. Столбец company_type_string содержит несколько кодов, разделенных ~, которые должны совпадать с кодами в table_2.

Таблица 1:

company    company_type_string
------------------------------
  A         1A~2B~3C
  B         1A~2B
  C         1A
  D         1A~2B~3C~4D

Таблица 2:

code    description
-----------------------
 1A     Finance
 2B     Law
 3C     Security
 4D     Marketing

Желаемый вывод:

company description
----------------------
   A    Finance
   A    Law
   A    Security
   B    Finance
   B    Law
   C    Finance
   D    Finance
   D    Law
   D    Security
   D    Marketing

Я попытался использовать split_string, но безуспешно. Есть ли способ сделать это соединение без изменения схемы БД?

Ответы [ 3 ]

0 голосов
/ 26 марта 2019

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

declare @Company table
(
    company char(1)
    , company_type_string varchar(100)
)

insert @Company values
('A', '1A~2B~3C')
, ('B', '1A~2B')
, ('C', '1A')
, ('D', '1A~2B~3C~4D')

declare @Code table
(
    code char(2)
    , description varchar(50)
)

insert @Code values
('1A', 'Finance')
, ('2B', 'Law')
, ('3C', 'Security')
, ('4D', 'Marketing')

select c.company
    , co.description
from @Company c
cross apply dbo.DelimitedSplit8K(c.company_type_string, '~') x
join @Code co on co.code = x.Item
0 голосов
/ 27 марта 2019

Здесь у вас есть пример кода, последняя часть важна для вас, довольно проста, проста в использовании и запоминании.

IF OBJECT_ID('tempdb..#table_1') IS NOT NULL
    DROP TABLE #table_1
CREATE TABLE #table_1
(
company VARCHAR(1),
company_type_string VARCHAR(max)
)

INSERT INTO #table_1 VALUES
('A','1A~2B~3C'),
('B','1A~2B'),
('C','1A'),
('D','1A~2B~3C~4D')

IF OBJECT_ID('tempdb..#table_2') IS NOT NULL
    DROP TABLE #table_2
CREATE TABLE #table_2
(
code VARCHAR(2),
description VARCHAR(30)
)

INSERT INTO #table_2 VALUES
('1A','Finance'),
('2B','Law'),
('3C','Security'),
('4D','Marketing')

SELECT 
    company,
    description 
FROM #table_1 c
INNER JOIN #table_2 ct
    ON c.company_type_string like '%' + ct.code +  '%'
ORDER BY company
0 голосов
/ 26 марта 2019

Если вы не можете исправить схему, должен работать следующий запрос:

   SELECT c.company, ct.description
   FROM table_1 c
   CROSS APPLY STRING_SPLIT(c.company_type_string,'~') t
   INNER JOIN table_2 ct
   ON t.value=ct.code;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...