복붙노트

[SQL] 여러 열을 일치 뚜렷한 결과를 제공 SQL 쿼리

SQL

여러 열을 일치 뚜렷한 결과를 제공 SQL 쿼리

내가 SQL에 아주 새로운 오전으로 죄송합니다, 내 문제에 대한 더 나은 제목을 제공 할 수 있습니다. 나는 문제가 아래를 해결하는 SQL 쿼리 문자열을 찾고 있어요.

하자 다음과 같은 테이블을 가정합니다 :

DOCUMENT_ID |     TAG
----------------------------
   1        |   tag1
   1        |   tag2
   1        |   tag3
   2        |   tag2
   3        |   tag1
   3        |   tag2
   4        |   tag1
   5        |   tag3

지금은 하나 또는 그 이상의 태그를 포함 (그러나 그 모든 지정된 태그를 제공해야합니다) 모든 별개의 문서 ID 년대를 선택합니다. 예를 들면 : (이 tag2로되어 있지 않는하지만 4 예를 들어) 1, 3 반환 모두가 document_ID의 tag1로하고이 tag2을 선택합니다.

그렇게 할 수있는 가장 좋은 방법이 있을까요?

문안 인사, 과

해결법

  1. ==============================

    1.

    SELECT document_id
    FROM table
    WHERE tag = 'tag1' OR tag = 'tag2'
    GROUP BY document_id
    HAVING COUNT(DISTINCT tag) = 2
    

    제약의 부족에 대한 업데이트 ...

  2. ==============================

    2.이 DocumentID와 태그가 기본 키 가정합니다.

    이 DocumentID와 태그가 기본 키 가정합니다.

    편집 : DISTINCT 태그를 계산 HAVING 절 변경되었습니다. 그 방법은 기본 키가 무엇인지 중요하지 않습니다.

    테스트 데이터

    -- Populate Test Data
    CREATE TABLE #table (
      DocumentID varchar(8) NOT NULL, 
      Tag varchar(8) NOT NULL
    )
    
    INSERT INTO #table VALUES ('1','tag1')
    INSERT INTO #table VALUES ('1','tag2')
    INSERT INTO #table VALUES ('1','tag3')
    INSERT INTO #table VALUES ('2','tag2')
    INSERT INTO #table VALUES ('3','tag1')
    INSERT INTO #table VALUES ('3','tag2')
    INSERT INTO #table VALUES ('4','tag1')
    INSERT INTO #table VALUES ('5','tag3')
    
    INSERT INTO #table VALUES ('3','tag2')  -- Edit: test duplicate tags
    

    질문

    -- Return Results
    SELECT DocumentID FROM #table
    WHERE Tag IN ('tag1','tag2')
    GROUP BY DocumentID
    HAVING COUNT(DISTINCT Tag) = 2
    

    결과

    DocumentID
    ----------
    1
    3
    
  3. ==============================

    3.

    select DOCUMENT_ID
          TAG in ("tag1", "tag2", ... "tagN")
       group by DOCUMENT_ID
       having count(*) > N and 
    

    필요에 따라 N 및 태그 목록을 조정합니다.

  4. ==============================

    4.

    Select distinct document_id 
    from {TABLE} 
    where tag in ('tag1','tag2')
    group by id 
    having count(tag) >=2 
    

    당신이 태그의 목록을 생성하는 방법 절은 응용 프로그램 구조에 따라 다릅니다 곳. 동적 코드의 한 부분으로 쿼리를 생성하는 경우, 당신은 단순히 큰 동적으로 생성 된 문자열로 쿼리를 구성 할 수도 있습니다.

    우리는 항상 데이터를 쿼리 저장 프로 시저를 사용했다. 이 경우, 우리는 XML 문서로 태그 목록에 전달합니다. - 이들 중 하나 같이 그 힘 모습 뭔가 같은 절차는 어디에 입력 인수는 것

    <tags>
       <tag>tag1</tag>
       <tag>tag2</tag>
    </tags>
    
    
    CREATE PROCEDURE [dbo].[GetDocumentIdsByTag]
    @tagList xml
    AS
    BEGIN
    
    declare @tagCount int
    select @tagCount = count(distinct *) from @tagList.nodes('tags/tag') R(tags)
    
    
    SELECT DISTINCT documentid
    FROM {TABLE}
    JOIN @tagList.nodes('tags/tag') R(tags) ON {TABLE}.tag = tags.value('.','varchar(20)')
    group by id 
    having count(distict tag) >= @tagCount 
    
    END
    

    또는

    CREATE PROCEDURE [dbo].[GetDocumentIdsByTag]
    @tagList xml
    AS
    BEGIN
    
    declare @tagCount int
    select @tagCount = count(*) from @tagList.nodes('tags/tag') R(tags)
    
    
    SELECT DISTINCT documentid
    FROM {TABLE}
    WHERE tag in
    (
    SELECT tags.value('.','varchar(20)') 
    FROM @tagList.nodes('tags/tag') R(tags)
    }
    group by id 
    having count( distinct tag) >= @tagCount 
    END
    

    종료

  5. from https://stackoverflow.com/questions/1202668/sql-query-that-gives-distinct-results-that-match-multiple-columns by cc-by-sa and MIT license