2014-07-25 2 views
1

여러 ID와 관련된 행 선택 범위를 좁히는 방법에 대해 고민하고 있습니다. 다음은 데이터의 문제점입니다.SQL에서 여러 ID를 공유하는 행 검색

|Widget | |Widget Category  | |Part Category | |Part   | 
+---------+ +--------------------+ +--------------+ +-------------+ 
|Id|Name | |WidId|CatId|CatName | |PartId| CatId | |Id|Name  | 
+---------+ +-----+-----+--------+ +------+-------+ +--+----------+ 
| 1|item01| | 1| 1|Windows | |  1|  1| | 1|Glass  | 
| 2|item02| | 2| 1|Windows | |  1|  2| | 2|Door Frame| 
| 3|item03| | 3| 1|Windows | |  2|  2| | 3|Wheel  | 
| 4|item04| | 1| 2|Door | |  4|  2| | 4|Handle | 
| 5|item05| | 5| 2|Door |  
| 6|item06| | 6| 3|Trunk | 

하나 이상의 위젯이 위젯 카테고리에 속할 수 있습니다. 많은 위젯 카테고리는 많은 부분 카테고리를 가질 수 있습니다. 많은 부품이 많은 부품 범주의 일부가 될 수 있습니다. 어떤 부품이 위젯에 연결되어 있는지 알아야합니다. 그래서 우리는 Item01에 "Glass"부품이 있고 Item05에 "Glass, Door Frame 및 Handle"부품이 있음을 알고 있습니다.

여기까지 필자가 가지고있는 SQL이지만 동적 인 경우 일주일에 한 번 저장 프로 시저에서 실행할 수 있습니다.

---- This gives me the Correct number of Widgets to Parts based on set of 2 category ID's as a quick and static hack 
SELECT W.Id 
FROM Widget W 
INNER JOIN dbo.[WidgetCategory] WC1 ON WC1.WidId = W.Id 
INNER JOIN dbo.[WidgetCategory] WC2 ON WC2.WidId = W.Id 
WHERE WC1.CatId = 1 AND WC2.CatId = 2 
GROUP BY W.Id 

상기 질의에 대한 이유는 관련된 두 종류 및 부품에 관련된 모든 위젯의 교집합은 widgetid 년대 PartId 년대로 그룹화하는 테이블 구조를 얻을 수있다. 아래의 표는 내가 일부 (PartId BY COUNT (WidId) GROUP)에 얼마나 많은 위젯 집계 할 수 있도록려고하고있는 무슨이다 :

|WidId|PartId|WidgetName| 
+-----+------+----------+ 
| 1|  1| Item01| 
| 2|  1| Item02| 
| 3|  1| Item03| 
| 1|  2| Item01| 
| 5|  2| Item05| 

업데이트 질문 : 나는에서이 응답을 얻을 수있는 방법 위의 표는 두 카테고리의 교차 만 반환합니다.

|WidId|PartId|WidgetName| 
+-----+------+----------+ 
| 1|  1| Item01| 
| 1|  2| Item01| 

어떤 도움을 주시면 감사하겠습니다. 슬프게하게해서 미안 해요. 주말에 가기 전에 빨리 게시해야했습니다.

편집 : 죄송합니다. ProductId에 관해서는 사용하고 있던 일부 SQL에서 남겨 두었습니다. 위젯 ID 여야합니다. 이 문제에 더 많은 명확성을 추가하고 추가 문제를 추가했습니다.

+0

동적이어야한다는 것은 무엇을 의미합니까? – Cheruvian

+0

ProductID는 어디에서 볼 수 있습니까? 왜 같은 테이블에서 두 번 조인을해야합니까? – Frazz

+0

"동적"으로 말하면 부품 카테고리의 각 인스턴스에서 발생하는 모든 위젯 카테고리의 교차점을 찾아야한다는 의미입니다. – MarcusM

답변

1

나는 이와 같은 쿼리가 필요하다고 생각합니다.

SELECT DISTINCT w.WidId, p.ParId, w.Name 
FROM Widget w 
JOIN WidgetCategory wc ON wc.WidId=w.Id 
JOIN PartCategory pc ON pc.CatId=wc.CatId 
JOIN Part   p ON p.Id=pc.ParId 

왜 WidgetCategory 테이블에 두 번 가입해야하는지 알 수 없습니다. 필요한 것은 PartCategory 테이블을 조인하여 Part 테이블에 도달하는 것입니다.

왜 그룹화합니까? 모든 파트를 원하면 특정 SQL 기능을 사용하여 단일 행의 모든 ​​파트를 연결하지 않으면 그룹화 할 수 없습니다. 사용중인 데이터베이스 엔진에 따라 가능하지 않을 수도 있습니다.

위젯 X에서 파트 Y로 이동하는 데 여러 가지 방법이있는 경우를 대비해서 DISTINCT를 추가했습니다. 중복 제거에 충분합니다. 집계를 사용하여 다른 작업을 수행하거나 다른 작업을 수행해야하는 경우가 아니면 GROUP BY가 필요하지 않습니다.

+0

내 질문을 살펴 보는 데 시간을내어 주셔서 감사합니다. 지금 인터넷 서비스가있는 곳으로 돌아가서 업데이트했습니다. Microsoft SQL을 사용하여 부품에 위젯 수를 표시하려고했지만 위젯 범주와 부품 범주 간의 연결 만 있습니다. – MarcusM

+0

답변을 약간 수정했습니다. 이거 해봤 니? – Frazz

+0

거기에 두 범주의 교차 결과를 얻을 수있는 "item01"결과를 얻을 수있는 방법이 있습니까? 두 범주 모두에 없기 때문에 다른 범주를 제외 시키니까? 이 질문을 반영하도록 질문이 업데이트되었습니다. 도와 주셔서 다시 한 번 감사드립니다! – MarcusM