Sql 查询多对多结构以获取连接行的子集
我有一个简单的多对多数据库结构: 表1:Sql 查询多对多结构以获取连接行的子集,sql,query-optimization,Sql,Query Optimization,我有一个简单的多对多数据库结构: 表1:项目 柱: ITEM\u ID,ITEM\u NAME 表2:属性 柱: ATTRIBUTE\u ID,ATTRIBUTE\u NAME 表3:ITEM\u属性 ITEM\u ID,ATTRIBUTE\u ID 我想要的是“获取具有以下x属性的所有项目”。X可以是任意数量的属性 我想到的最好的方法是下面这些,但我相信一定有更好的方法使用连接和/或“select where in”子句……但我想不起来 SELECT * FROM Item WHERE Ite
项目
柱:
ITEM\u ID,ITEM\u NAME
表2:属性
柱:
ATTRIBUTE\u ID,ATTRIBUTE\u NAME
表3:ITEM\u属性
ITEM\u ID,ATTRIBUTE\u ID
我想要的是“获取具有以下x属性的所有项目”。X可以是任意数量的属性
我想到的最好的方法是下面这些,但我相信一定有更好的方法使用连接和/或“select where in”子句……但我想不起来
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);
我不希望为列表中的每个属性在(…)中添加额外的“ITEM_ID”..esp如果属性列表超过20长我建议用您想要的属性填充一个临时表。一旦您有了这个表,查询就会变得更干净、更易于维护
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
)