Если вы не можете исправить дизайн (вы не должны хранить несколько штук данных в одном столбце, как указано в другом месте), вы можете выполнить это с помощью функции разделения:
CREATE FUNCTION dbo.SplitStrings
(
@List NVARCHAR(MAX),
@Delim NCHAR(1)
)
RETURNS TABLE
AS
RETURN (SELECT DISTINCT Item FROM
(SELECT Item = x.i.value('(./text())[1]', 'nvarchar(max)')
FROM (SELECT [XML] = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delim, '</i><i>') + '</i>').query('.')
) AS a CROSS APPLY [XML].nodes('i') AS x(i)) AS y
WHERE Item IS NOT NULL
);
GO
Теперь вы можете сказать:
SELECT t1.FAQ, t2.MODELS, t2.PIC
FROM dbo.Table1 AS t1
CROSS APPLY dbo.SplitStrings(t1.MODELS, ' ') AS s
INNER JOIN dbo.Table2 AS t2
ON s.Item COLLATE SQL_Latin1_General_CP1_CI_AS
= t2.Models COLLATE SQL_Latin1_General_CP1_CI_AS
ORDER BY t1.FAQ;
Результаты:
FAQ MODELS PIC
---- ------ ---------
faq1 model1 model1pic
faq2 model1 model1pic
faq2 model2 model2pic
faq3 model1 model1pic
faq3 model2 model2pic
faq3 model3 modal3pic
Запрос вы пытались использовать:
SELECT kwfaqtmp.faqmodelnum, kwFAQtmp.issue,kwfaqtmp.resolution,
kwtable4tmp.modelnum, kwtable4tmp.prodpic
FROM kwfaqtmp AS t1
CROSS APPLY dbo.SplitStrings(t1.faqmodelnum, ' ') AS s
INNER JOIN dbo.kwtable4tmp AS t2
ON s.item COLLATE SQL_Latin1_General_CP1_CI_AS
= t2.modelnum COLLATE SQL_Latin1_General_CP1_CI_AS
ORDER BY t1.issue;
Это просто не действует. Хотя это не должно приводить к точной ошибке, которую вы цитируете в комментарии. Как насчет сохранения псевдонимов t1/t2, как показал мой первоначальный запрос?
SELECT t1.faqmodelnum, t1.issue, t1.resolution,
t2.modelnum, t2.prodpic
FROM kwfaqtmp AS t1
CROSS APPLY dbo.SplitStrings(t1.faqmodelnum, ' ') AS s
INNER JOIN dbo.kwtable4tmp AS t2
ON s.item COLLATE SQL_Latin1_General_CP1_CI_AS
= t2.modelnum COLLATE SQL_Latin1_General_CP1_CI_AS
ORDER BY t1.issue;
Вы говорите о расщеплении данных столбцов? – akatakritos
Правильно! Я только что редактировал вопрос. – InCode