[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.
SELECT document_id FROM table WHERE tag = 'tag1' OR tag = 'tag2' GROUP BY document_id HAVING COUNT(DISTINCT tag) = 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.
select DOCUMENT_ID TAG in ("tag1", "tag2", ... "tagN") group by DOCUMENT_ID having count(*) > N and
필요에 따라 N 및 태그 목록을 조정합니다.
-
==============================
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
종료
from https://stackoverflow.com/questions/1202668/sql-query-that-gives-distinct-results-that-match-multiple-columns by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL의 : 계산 된 열 (0) | 2020.06.13 |
---|---|
[SQL] PostgreSQL는 주어진 ID에 대한 가장 최근 항목을 선택 (0) | 2020.06.13 |
[SQL] plpgsql의 트리거 기능에 여러 열을 업데이트 (0) | 2020.06.13 |
[SQL] SQL : 실시간 트랜스 (0) | 2020.06.13 |
[SQL] 점진적는 OR 쿼리 식을 구축 [중복] (0) | 2020.06.13 |