2012-02-14 3 views
2

나는 "수직"을 제외하고 설명하는 방법을 모른다. MSSQL "수직"으로 선택 - 어디에서

은 다음 표를 상상해 : 59, 61 :
TAGID|PRODUCTID|SHOP_ID 
59 |3418-7 |38 
61 |3418-7 |38 
60 |4227-4 |38 
61 |4227-4 |38 

지금 내가 태그 ID와 관련이있는 모든 제품 ID를 반환합니다. 즉, 에 행이있는 제품 ID의 값은 모두 태그 ID입니다.

그래서 나는 3418-7을 반환 할 수 있지만 4227-4

은 어떻게 SQL 문에 가능한 한이 간단하게 작성합니까?

는 지금까지이 작업 문이지만, 나는이 훨씬 스마트 한 방법으로 할 수있는 느낌 :

SELECT 
    productid 
FROM shop_tag_relations 
WHERE 
    productid IN (select productid from shop_tag_relations WHERE tagid=59) 
AND 
    productid IN (select productid from shop_tag_relations WHERE tagid=61) 
GROUP BY productid,shop_id 
+0

이것은 무엇을 의미 하는가? "tagID와 관련된 모든 제품 ID : 59,61" – YXD

+0

tagid 59 및 61과 관련된 productid를 리턴합니다. 이것은 한 테이블의 제품과 다른 테이블의 태그 사이의 관계를 그릴 수있는 관계 테이블입니다. 예를 들어 3418이 남성용 갈색 신발 인 경우 59 번 태그는 신발 일 수 있고 61 번 태그는 남성용, 72 가지 갈색 등일 수 있습니다. – Esben

답변

8
SELECT PRODUCTID 
FROM T 
WHERE TAGID IN (59,61) 
GROUP BY PRODUCTID 
HAVING COUNT(DISTINCT TAGID) = 2 

또는

SELECT PRODUCTID 
FROM T 
WHERE TAGID = 59 
INTERSECT 
SELECT PRODUCTID 
FROM T 
WHERE TAGID = 61 
+0

+1로 그룹별로 그룹화 : Portable AND fast –

+0

@EugenRieck - 올바른 색인 인 JOIN 또는 INTERSECT는 GROUP BY보다 빠르거나 빠릅니다. 확장하기가 쉽지 않습니다. –

+1

INTERSECT는 GROUP BY보다 훨씬 휴대하기가 쉽지 않습니다. JOIN은 태그가 많은 GROUP BY보다 훨씬 복잡합니다. 따라서 GROUP BY는 내가 생각하기에 최적의 솔루션이라고 생각합니다. –

2
SELECT DISTINCT 
a.PRODUCTID 
FROM mytable AS a 
INNER JOIN mytable AS b ON a.PRODUCTID=b.PRODUCTID 
WHERE a.TAGID=59 
AND b.TAGID=61 
; 
+0

2 개가 아닌 10 개 태그 인 경우 어떻게됩니까? – Esben

+1

이 문제에 대한 모든 해결책에는 스케일링 문제 (초기 해결책, 제 답변) 또는 휴대 가능하지 않습니다 (교차점)가 있습니다. 독을 선택 했어. 요점은, JOIN 솔루션이 쿼리 플래너에 의해 고도로 최적화된다는 것입니다. TAGID에 인덱스가있는 것입니다. –

+0

설명해 주셔서 감사합니다 – Esben

1
SELECT ProductId 
FROM shop_tag_relations 
WHERE TAGID IN (59,61) 
GROUP BY ProductId 
HAVING COUNT(DISTINCT TagId) = 2