設計を修正できない場合 (他の場所で指摘されているように、単一の列に複数のデータを格納するべきではありません)、分割関数を使用してこれを実現できます。
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;