我遇到了一个SQL查询的小问题,想要请教大家的智慧来看看我错过了什么。我相当确定以下代码可以运行,但它似乎非常低效,我想知道是否有更聪明的方法(最好使用连接而不是子查询)来完成这个任务。
问题
假设我有一些表格:
当至少有一个规则为真时,将赢得奖项。当所有条件都为真时,规则才为真。当其输入ID存在于输入表中或未出现在输入表中(由期望值字段指定)时,条件为“真”。这可能等价于:“在输入表中计数(输入ID)=期望值”对于条件的输入ID。
一些例子:
Prize
- PrizeId
RulePrize_Map
- PrizeId
- RuleId
Rule
- RuleId
Conditional
- ConditionalId
- RuleId
- InputId
- ExpectedValue (bit)
Input
- InputId
当至少有一个规则为真时,将赢得奖项。当所有条件都为真时,规则才为真。当其输入ID存在于输入表中或未出现在输入表中(由期望值字段指定)时,条件为“真”。这可能等价于:“在输入表中计数(输入ID)=期望值”对于条件的输入ID。
一些例子:
Conditional (InputId = 11, ExpectedValue = 1) -> True if InputId 11 in Input Table
Conditional (InputId = 12, ExpectedValue = 0) -> True if Inputid 12 NOT in Input Table
我的目标
我想获取所有至少有一个“规则”为“true”的“奖品”。如果只能得到“所有真实的规则
”,我也会满足。
我的尝试
select p.PrizeId from Prize p INNER JOIN RulePrize_Map rpm ON rpm.PrizeId = p.PrizeId
WHERE p.PrizeId IN
(select r.PrizeId from Rule r
where
(select count(*) from Conditional c1 where c1.RuleId = r.RuleId)
=
(select count(*) from Conditional c2
where c2.RuleId = r.RuleId AND
(select count(*) from Input i where i.InputId = c2.InputId) = c2.ExpectedValue
)
)
GROUP BY p.prizeId