2016-11-02 4 views
3

나는 2 개의 테이블 (EID와 NAME)이있는 TABLE1과 2 개의 컬럼 (CID와 E_LIST)이있는 TABLE2를 가지고있다. 이제 TABLE2 E_LIST EID 함께 TABLE1 데이터를 선택하고 싶지 않지만 작동하지 않는 것.문자열 ID에서 ID가있는 데이터를 선택하는 방법은 무엇입니까?

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을 사용하여 하나의 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에서 하나를 생성 할 수있는 분할 문자열 함수를 필요로 훨씬 쉽게 될 것입니다.

나는

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; 
관련 문제