-2

LinqtoSQLの使用

列にスペースを含む列を持つセカンダリテーブルのすべての行を含めるために、1つのクエリと照合をどのように実行しますか?

表1:

ID  FAQ    MODELS 
1   faq1   model1 
2   faq2   model2 model1
3   faq3   model3 model2 model1   (Spaces in models column)

表2:

ID  MODELS PIC
1   model1 model1pic
2   model2 model2pic
3   model3 modal3pic

期待:

faq1 model1 model1pic
faq2 model1 model1pic
faq2 model2 model2pic
faq3 model1 model1pic
faq3 model2 model2pic
faq3 model3 model3pic


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;
4

3 に答える 3

2

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

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;
于 2012-05-16T18:19:39.173 に答える
0

データベースをリファクタリングする必要があると思います。

FAQ (remove MODELS column)

ID  FAQ
1   faq1
2   faq2
3   faq3

FAQMODELS (Create this table)
ID FAQ   MODELS
1  faq1  model1
2  faq2  model2
3  faq2  model1
4  faq3  model3
5  faq3  model2
6  faq3  model1

MODELSPIC    
ID  MODELS PIC
1   model1 model1pic
2   model2 model2pic
3   model3 modal3pic

その後、あなたはすることができます

SELECT
    FAQ, 
    MODELS, 
    PIC 
FROM FAQMODELS INNER JOIN MODELSPIC ON FAQMODELS.MODELS = MODELSPIC.MODELS
于 2012-05-16T18:31:47.863 に答える
0

マッピング クラスでColumnAttributeを使用する必要があります。テーブル内のスペースのあるフィールド名にマップされた、スペースのないフィールド名を持つ POCO クラスを作成します。

于 2012-05-16T18:25:30.863 に答える