2013-09-04 3 views
0

의 AttributeId /의 AttributeValue 조건의 N 번호 내가 어디에 모든 제품을 선택해야나는 제품 테이블과 ProductAttributeValues ​​테이블이

Product 
------- 
ID 1 
Name A 


ID 2 
Name B 

ProductAttributeValues 
------- 
ID   1 
ProductID 1 
AttributeID 1 
Values Z 


ID   2 
ProductID 1 
AttributeID 2  1 
Values Y 

ID   3 
ProductID 1 
AttributeID 3  1 
Values P 

,

((ProductAttributeValues.attrbuteid = X and ProductAttributeValues.Value = X) 
AND (ProductAttributeValues.attrbuteid = X and ProductAttributeValues.Value = X) 
AND ............................................................................ 
AND ............................................................................) 

이러한 조건이 동적을 만족하는 모든 제품을 선택하는 방법 . 그래서 1 또는 2 또는 3 정도가 될 수 있습니다.

그렇다면 n 개의 속성/속성 값 조건을 만족하는 모든 제품을 선택하는 방법은 무엇입니까?

답변

1

"집합 내 설정"쿼리입니다.

select productID 
from ProductAttributeValues pav 
group by productID 
having sum(case when ProductAttributeValues.attrbuteid = X and ProductAttributeValues.Value = X 
       then 1 else 0 end) > 0 and 
     sum(case when ProductAttributeValues.attrbuteid = Y and ProductAttributeValues.Value = Y 
       then 1 else 0 end) > 0 and 
     . . . 

having 절에 각 조건은 조건에 맞는 각 제품에 대한 속성의 수를 계산 : 나는 가장 일반적인 방법은 having caluse로 집계 생각합니다. 전체 절은 모든 조건에 적어도 하나의 행이있는 경우에 true입니다. 조인에서

+0

간단하게 좋은 .... – user960567

2

방법 1
사용 AttributeValues ​​테이블을 여러 번. 여러 열로 AttributeID와 AttributeValues과 함께

SELECT P.* 
FROM 
Product P 
JOIN ProductAttributeValues PA1 ON P.ID = PA1.ProductID AND PA1.AttributeID = X AND PA1.VALUES = X 
JOIN ProductAttributeValues PA2 ON P.ID = PA2.ProductID AND PA2.AttributeID = Y AND PA2.VALUES = Y 
JOIN ProductAttributeValues PA3 ON P.ID = PA3.ProductID AND PA3.AttributeID = Z AND PA3.VALUES = Z 
..........And So on 

방법 2
피벗 ProductAttributeValues ​​테이블. 이제는 제품 및 ProductAttributeValues에 쉽게 가입하여 필요한 데이터를 얻을 수 있습니다. 피벗
에 대한

SELECT * 
FROM Product P 
JOIN ProductAttributeValuesPivot PAP 
ON P.ID = PAP.ProductID 
WHERE PAP.AttributeX = X AND PAP.ValueX = X 
AND PAP.AttributeY = Y AND PAP.ValueY = Y 
PAP.AttributeZ = Z AND PAP.ValueZ = Z 
............... And So on 

링크 Dynamic Pivot Table in SQL Server
Technet Article for PIVOT and UNPIVOT
http://sqlmag.com/t-sql/create-pivoted-tables-3-steps