我对SQL查询有点麻烦,并且认为我会征求人群的智慧来查看我错过的东西。我很确定下面的工作,但它似乎很差,我想知道是否有一个更聪明的方法(理想情况下使用连接而不是子选择)来做到这一点。所有的行至少有一个孩子都有自己的孩子通过一个条件
的问题
比方说,我有一些表:
Prize
- PrizeId
RulePrize_Map
- PrizeId
- RuleId
Rule
- RuleId
Conditional
- ConditionalId
- RuleId
- InputId
- ExpectedValue (bit)
Input
- InputId
一个Prize
当至少一个Rule
为真赢了。 A Rule
当全部的Conditionals
为真时为真。当InputId
存在或不存在于Input
表中时,Conditional
为“真”,如ExpectedValue
指定的字段。这也许可以等同于:Count(InputId in Input table)
= ExpectedValue
对于Conditional's
InputId
。
一些例子:
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
我的目标
我想所有Prizes
其中至少一个Rule
是 “真”。我会解决:“所有Rules
这是真的”。
我尝试
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
只是一个想法:也许看不包括奖金,所有的规则都是假的... – pascal 2011-06-07 12:39:16