Объединение таблиц с подстрокой перед символом - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь присоединиться к таблицам. Присоединяемый столбец - это номер контракта. Таблица, к которой я пытаюсь присоединиться, имеет несколько номеров контрактов, каждый из которых разделен запятыми (ie. Contract1,Contract2,Contract3).

Я пробовал использовать LEFT CHARINDEX и SUBSTRING CHARINDEX, но ни один из них не работает.

Соединение, которое я пробовал, похоже, не работает:

SELECT *
FROM  tblA AS C WITH (NOLOCK)
INNER JOIN tblB AS tmp WITH(NOLOCK) 
      ON CONVERT(VARCHAR, c.Contract_No) = 
         CONVERT(VARCHAR, LEFT(tmp.ContractNo, CHARINDEX('-', tmp.ContractNo) - 1)) 

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Типичным методом поиска строки в списке CSV является использование следующего условия:

',' + tmp.ListOfContract_No + ',' like '%,' + c.Contract_No + ',%'

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

Обратите внимание, что этот метод неэффективен и obsfucated. Вы действительно должны исправить свою схему, чтобы сохранить каждый элемент списка CSV в отдельной строке таблицы. Хранение списков CSV в столбцах реляционной базы данных является плохой практикой и root многих зол. Подробнее об этом в этом известном сообщении SO (оно относится к MySQL, но в равной степени относится к SQL Server).

0 голосов
/ 30 января 2020

Способ присоединиться, который я выяснил, это

SELECT *
FROM  tblA AS C WITH (NOLOCK)
INNER JOIN tblB AS tmp WITH(NOLOCK) 
      ON CONVERT(VARCHAR, c.Contract_No) = 
SUBSTRING(tmp.ContractNo,0,CHARINDEX(',',tmp.ContractNo,0))
...