仅当所有行都存在于另一表中时才选择与一个表不同的

问题描述 投票:0回答:1

我有三张桌子;

StoreAttributes
TemplateCondtions
均与
ConditionAttributes
表以一对多关系连接。

条件属性

PK CondiitionAttributeId int
Name varchar(100)

商店属性

PK Id uniqueidentifier
StoreNbr string
ConditionAttributeId FK (From Condition Attributes)

模板条件

PK Id uniqueidentifier
TemplateId uniqueIdentifier
ConditionAttribureId FK (From Condition Attributes)

示例数据集:

StoreNbr    WalkConditionAttributeId
------------------------------------
5705        1
5705        2
5707        2
5705        3
5706        3

Id       TemplateId WalkConditionAttributeId
--------------------------------------------
105      78         1
109      78         2
500      78         3

我只想选择商店 5705,因为它与

WalkCondtionsAttributeId
的所有
TemplateId = 78
相匹配。

到目前为止我已经尝试过:

Select Distinct StoreNbr 
From StoreAttributes st
Where WalkConditionAttributeId in (Select ConditionAttributeId 
                                   From TemplateConditions 
                                   Where TemplateId = 78); 

这会返回错误的

StoreNbr
,因为它们在
TemplateConditions
表中至少包含一行。

sql sql-server relational-division
1个回答
0
投票

这是经典的关系划分。解决方案有很多,这里是一个:

SELECT
  sa.StoreNbr
FROM StoreAttributes sa
JOIN (
    SELECT tc.*,
      COUNT(*) OVER (PARTITION BY tc.TemplateId) AS count
    FROM TemplateConditons tc
    WHERE tc.TemplateId = 78
) tc ON tc.ConditionAttributeId = sa.ConditionAttributeId
GROUP BY
  sa.StoreNbr
HAVING COUNT(*) = MIN(tc.count);

db<>小提琴

© www.soinside.com 2019 - 2024. All rights reserved.