2016-11-02 5 views
3

私は2つのテーブル(EIDとNAME)を持つTABLE1と、2つのカラム(CIDとE_LIST)を持つTABLE2を持っています。今、TABLE2のE_LISTからのEIDを使ってTABLE1からデータを選択したいが、それは動作していないようだ。IDから文字列idsのデータを選択する方法は?

EID NAME 
E01 GREEN 
E02 BROWN 
E03 BLACK 
E04 APPLE 
E05 FOOD 
E06 FISH 

CID E_LIST 
C01 E02,E05,E06 
C02 E01,E02,E03 

SELECT * FROM TABLE1 WHERE EID IN (SELECT E_LIST FROM TABLE2 WHERE CID ='C01') 

ここで間違いを教えてください。これについて私に教えてください。ありがとうございました。

+0

意味がありません、例外はありますか?私は結果が得られないことを願っています。 Bcoz E_LISTには、カンマでデータが含まれています。分割して確認する必要があります。 – User

+0

@Srinath、エラーは発生しませんがデータを取得しません。 –

答えて

1

は、リンクのようにstring split functionを使用して好みます。他にも優れた機能があります。

SELECT * FROM TABLE1 WHERE EID IN (SELECT Item 
            FROM dbo.SplitString(SELECT TOP 1 E_LIST FROM TABLE2 WHERE CID ='C01')) 
+0

区切られた文字列を 'While'ループよりも分割する方がはるかに優れています –

+0

あなたのリンク.bookmarkedにある素晴らしい機能のコレクション。ありがとう –

+0

まあ、それは私のためにとても良いです。 –

0

クエリは、EIDとEIDのリストを比較します。サブクエリの代わりに結合を実行し、likeを使用して、1つのEIDを別のサブストリングにすることはできないと仮定して、問題を解決できます。

0

左結合クエリを使用します。それはあなたのために簡単になります

2

単一の列にカンマ区切り値を格納を停止します。 CIDE_LISTの組み合わせごとに個別の行があります。データ検索は

今すぐ戻って質問に来て、あなたがこの

SELECT * 
FROM TABLE1 
WHERE EID IN (SELECT cs.split_items 
       FROM TABLE2 t2 
         CROSS apply Udf_splitstring(t2.E_LIST, ',') cs 
       WHERE t2.CID = 'C01') 

がここSplit strings the right way – or the next best wayから1を作成して行うために、分割文字列関数を必要とする方がはるかに簡単になります。

私は、集計テーブル方法

CREATE FUNCTION dbo.Udf_splitstring 
(
    @List  NVARCHAR(MAX), 
    @Delimiter NVARCHAR(255) 
) 
RETURNS TABLE 
WITH SCHEMABINDING AS 
RETURN 
    WITH cteTally(N) AS 
    (
     SELECT TOP (DATALENGTH(ISNULL(@List,1))+1) Number-1 
      FROM dbo.Numbers ORDER BY Number 
    ), 
    cteStart(N1) AS 
    (
     SELECT t.N+1 
      FROM cteTally t 
      WHERE (SUBSTRING(@List,t.N,1) = @Delimiter OR t.N = 0) 
    ) 
    SELECT split_items = SUBSTRING(@List, s.N1, 
     ISNULL(NULLIF(CHARINDEX(@Delimiter, @List, s.N1), 0) - s.N1, 8000)) 
    FROM cteStart AS s; 
関連する問題