ки ...
Когда вы предложили попробовать CTE, вы идете в правильном направлении.
Что вам нужно сделать, так это цепочки 3 CTE вместе. Когда у вас есть цепочка обработки, вам нужно постепенно проходить через нее, как фильтр, сначала разбивая идентификаторы на столбцы целых, затем соединяя их в таблице 2, чтобы получить имена, а затем объединяйте эти имена.
Как уже упоминалось ранее, тот, кто спроектировал это, спроектировал его плохо, но при условии, что вы используете сервер MS-SQL и T-SQL, следующий код сделает то, что вам нужно:
DECLARE @tempString AS varchar(max)
SET @tempString =''
;WITH firstCte AS
(
SELECT
CAST('<M>' + REPLACE(contactpeopleids, ',','</M><M>') + '</M>' AS XML) AS Names
FROM
soTable1
-- THIS WHERE CLAUSE MUST MATCH THE FINAL WHERE CLAUSE
WHERE
name = 'John'
AND surname = 'Cobaing'
)
,secondCte AS
(
SELECT
Split.a.value('.','VARCHAR(100)') AS NameIds
FROM
firstCte
CROSS APPLY Names.nodes('/M') Split(a)
)
,thirdCte AS
(
SELECT
t2.name + ' ' + t2.lastname AS theContactName
FROM
secondCte t1
-- NOTE: IF THE IDS YOU EXTRACT FROM TABLE 1 DO NOT HAVE A MATCH IN TABLE 2 YOU WILL GET NO RESULT FOR THAT ID HERE!
-- IF YOU WANT NULL RESULTS CHANGE THIS TO A 'LEFT JOIN'
INNER JOIN
soTable2 t2 ON t1.NameIds = t2.id
)
SELECT
@tempString = @tempString + ',' + theContactName
FROM
thirdCte
;
-- The select substring is used to remove the leading ','
SELECT
name,
surname,
age,
location,
SUBSTRING(@tempString,2,LEN(@tempString)) AS contactpeoplenames
FROM
soTable1
WHERE
name = 'John'
AND surname = 'Cobaing'
Это, вероятно, не так элегантно, как могло бы быть, и для простоты использования вы можете захотеть обернуть его в пользовательскую функцию и передать имя и фамилию человека, чтобы взглянуть на него. Если вы сделаете это таким образом, то сможете использовать функцию в обычном запросе выбора SQL, чтобы возвращать строки непосредственно из таблицы 1 в представление или другую таблицу.
Самое интересное в том, что мы заставляем SQL-сервер разбивать строку. Вы заметите, что мы на самом деле заменим ',' тегами XML, а затем используем функции обработки XML, чтобы сервер SQL думал, что мы обрабатываем строку XML.
В SQL Server предусмотрены отличные процедуры для выполнения задач такого рода, например, в версии 2005 года, и он позволяет сериализовать и десериализовать целые блоки XML в поле varchar прямо из таблицы db, создав SQL-сервер. думаю, что он имеет дело с XML, он делает большую часть тяжелой работы для нас.