我有三张桌子;
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
表中至少包含一行。
这是经典的关系划分。解决方案有很多,这里是一个:
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);