문제

죄송합니다. SQL을 처음 접했기 때문에 내 문제에 대한 더 나은 제목을 제공 할 수 없었습니다. 아래 문제를 해결하는 SQL 쿼리 문자열을 찾고 있습니다.

다음 표를 가정 해 봅시다.

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

이제 하나 이상의 태그가 포함 된 모든 고유 한 문서 ID를 선택하고 싶습니다 (그러나 지정된 모든 태그를 제공해야합니다). 예를 들어 : tag1로 모든 docum

그렇게하는 가장 좋은 방법은 무엇입니까?

안부, 카이

도움이 되었습니까?

해결책

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

편집하다:

제약 부족으로 업데이트되었습니다 ...

다른 팁

이것은 DocumentID와 태그가 기본 키라고 가정합니다.

편집하다: 뚜렷한 태그를 계산하기 위해 조항이 변경되었습니다. 그렇게하면 기본 키가 무엇인지는 중요하지 않습니다.

테스트 데이터

-- 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
select DOCUMENT_ID
      TAG in ("tag1", "tag2", ... "tagN")
   group by DOCUMENT_ID
   having count(*) > N and 

필요에 따라 n과 태그 목록을 조정하십시오.

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

Where 절에서 태그 목록을 생성하는 방법은 응용 프로그램 구조에 따라 다릅니다. 코드의 일부로 쿼리를 동적으로 생성하는 경우 쿼리를 큰 동적으로 생성 된 문자열로 구성 할 수 있습니다.

우리는 항상 저장된 절차를 사용하여 데이터를 쿼리했습니다. 이 경우 태그 목록을 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top