1

システムの下にあるものは既に配置されているため、変更には時間がかかることに注意してください。そのため、正規化するのが最善の方法であることはわかっていますが...

次の2つのテーブルがあります

Tbl1

CompId      CommaList
------      --------
2           '122','54','90'   
54          '53','76'
34          '87' 
22          '98'


Tbl2

ID     ClientId   
--     --------
1      122
2      76 
3      87
4      98

必要なのは、Tbl1 と Tbl2 を結合してから、CompId と ID を返すことです。

結合は、tbl2.ClientId と tbl1.CommaList から行う必要があります (これは、一致する値を見つける必要があるカンマ区切りのリストです。

これが理にかなっていることを願っています。

    select tbl1.CompId, tbl2.Id
    from tbl1  join tbl2 on CommaList = tbl2.ClientId

それらは異なるタイプであるため、明らかにこれは機能しません。さらに、CommaList 内のリストを見つける必要があります。

最終結果は次のようになります。

ID       CompId
--       ------
1        2 
2        54
3        34
4        22
4

5 に答える 5

3

免責事項データベース列にコンマ区切りのリストを格納することはコードの臭いであり、通常、データベース構造を正規化する必要があることを示します。可能であれば、コードでこれを行わないでください。


カンマ区切りのリスト内のクライアントID値をLIKE句と照合することで解決できます。

select
  t2.ID, t1.CompId
from Tbl1 t1
join Tbl2 t2 on t1.CommaList
  like '%''' + cast(t2.ClientId as varchar(10)) + '''%'

デモ:http ://www.sqlfiddle.com/#!3 / 6d416 / 6

于 2013-03-12T16:25:21.767 に答える
2

ほとんどの場合、CommaList を拡張して、結合テーブルを使用してこれを行います。つまり、次のテーブルが必要です

 Tbl3
 CompID      ClientID
 2            122
 2             54
 2             90
 54            53

一部のデータベースCommaListでは、配列として格納してIN演算子を使用できますが、これは非標準で非効率的です。(mellamokb の回答のように文字列検索を行うこともできますが、彼の免責事項が私のものと同じであることに注意してください。)

SELECT id, compID FROM Tbl3 NATURAL JOIN Tbl2;

特別な場合を除いて、 のような非正規化データは避けてくださいTbl1

于 2013-03-12T16:28:24.517 に答える
2

テストしていないが動作するはずのソリューションを投稿しました。このやり方をするのは間違っていると感じています。私は今、あなたに答えを奨励することで汚れていると感じています。

SELECT tbl1.CompId, tbl2.Id
FROM tbl1  
  JOIN tbl2 ON CommaList LIKE '%''' + CAST(tbl2.ClientId AS VARCHAR) + '%''' 
于 2013-03-12T16:28:45.810 に答える
1

これを試して:

select tbl1.CompId, tbl2.Id
from tbl1, tbl2 
where CHARINDEX('''' + CONVERT(varchar(50),tbl2.ClientId) + '''', CommaList)<> 0
于 2013-03-12T16:26:09.317 に答える
0

何らかの理由でChar Indexまたはlikeソリューションを使用できなかった場合は、カンマ リストを分割してから結合できます。たとえば、概念的に同等のことを行う必要がある場合

CommaList = tbl2.ClientId の tbl2 からLEFT結合 tbl1 結合

with split as (

SELECT 
       CompID,
       Substring(commalist, number, Charindex(',', commalist + ',', number) 
                                    - number) 
                                                                   AS clientID 
FROM   tbl1  
       JOIN master..spt_values v 
         ON number <= Len(commalist) 
            AND Substring(',' + commalist, number, 1) = ',' 
WHERE  v.type = 'P' )

SELECT 

    split.CompId,
    split.clientID,
    tbl2.id


FROM 

  split
  LEFT JOIN tbl2 
  on tbl2.clientID = split.clientID

デモ

ノート:

  • 引用符で区切られた部分を処理することは気にしませんでしたが、次の方法で簡単に行うことができますreplace(commalist,'''','')
  • そのままでは、これは長さが <= 2047 の commalist の値でのみ機能します。より大きなリストを扱っている場合は、この回答の GarethD の2 番目の例を使用して、より大きな数値テーブルを生成できます
于 2013-03-12T19:28:16.110 に答える