Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查询多对多结构以获取连接行的子集_Sql_Query Optimization - Fatal编程技术网

Sql 查询多对多结构以获取连接行的子集

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

我有一个简单的多对多数据库结构:

表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 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
)