2011-01-20 7 views
1

접합 행의 서브 세트를위한 많은 구조에 많은 쿼리 :I 많은 DB 구조 간단한 많은가

표 1 ITEM 열 : ITEM_ID, ITEM_NAME

표 2 : Attribute 열 : ATTRIBUTE_ID, ATTRIBUTE_NAME

표 3 : ITEM_ATTRIBUTE ITEM_ID, ATTRIBUTE_ID

내가 원하는 것은 "다음 x 속성을 가진 모든 항목을 가져 오는 것"입니다. X는 임의의 수의 속성이 될 수 있습니다.

내가 가장 잘 생각해내는 것은 다음과 같지만 조인을 사용하거나 "어디에서 선택"하는 것이 더 나은 방법이라고 생각합니다.하지만 생각할 수는 없습니다.

SELECT * FROM Item 
WHERE Item.ITEM_ID IN 
(SELECT ITEM_ATTRIBUTE.item_ID FROM ITEM_ATTRIBUTE WHERE ITEM_ATTRIBUTE.attribute_ID =1) 
and Item.ITEM_ID in 
(SELECT ITEM_ATTRIBUTE.item_ID FROM ITEM_ATTRIBUTE WHERE ITEM_ATTRIBUTE.attribute_ID =3); 

차라리 속성 목록은 내가 제안

답변

0

20 + 긴 ESP 경우 .. 목록의 각 속성에 추가 "ITEM_ID (...)를 추가 할 필요가 없습니다 것 임시 테이블에 필요한 속성을 채 웁니다.이 테이블을 가져 오면이 쿼리는 훨씬 더 명확하고 유지 관리가 용이 ​​해집니다.

DECLARE @Item TABLE (
    Item_Id INT, 
    Item_Name VARCHAR(50) 
) 

DECLARE @Attribute TABLE (
    Attribute_Id INT, 
    Attribute_Name VARCHAR(50) 
) 

DECLARE @Item_Attribute TABLE (
    Item_Id INT, 
    Attribute_Id INT 
) 

INSERT INTO @Item VALUES (1, 'Widget') 
INSERT INTO @Item VALUES (2, 'Woozle') 

INSERT INTO @Attribute VALUES (1, 'foo') 
INSERT INTO @Attribute VALUES (2, 'bar') 
INSERT INTO @Attribute VALUES (3, 'baz') 
INSERT INTO @Attribute VALUES (4, 'qux') 

INSERT INTO @Item_Attribute VALUES (1, 1) 
INSERT INTO @Item_Attribute VALUES (1, 2) 
INSERT INTO @Item_Attribute VALUES (1, 3) 
INSERT INTO @Item_Attribute VALUES (2, 1) 
INSERT INTO @Item_Attribute VALUES (2, 4) 

DECLARE @Required_Attribute TABLE (
    Attribute_Id INT 
) 

INSERT INTO @Required_Attribute VALUES (1) 
INSERT INTO @Required_Attribute VALUES (2) 

SELECT * 
FROM @Item i 
WHERE NOT EXISTS (
    SELECT 1 
    FROM 
     @Required_Attribute ra 
     LEFT JOIN @Item_Attribute missingAttribute 
      ON ra.Attribute_Id = missingAttribute.Attribute_Id 
      AND missingAttribute.Item_Id = i.Item_Id 
    WHERE 
     missingAttribute.Attribute_Id IS NULL 
) 
관련 문제