具有组合条件的SELECT查询

时间:2016-11-04 12:10:35

标签: sql

SQL noobie在这里,尝试了我的运气谷歌搜索,但空洞或没有知道正确的关键字。尽管如此,在所有这些高级问题之间感到相当尴尬,但仍然希望能够获得解决方案并学习。

假设我们有一张表格,代表不同球队参加儿童体育锦标赛的参赛者。

参与者表:

enter image description here

我们的目标是选择选择了错误团队的参与者。让我们假设团队的条件是这样的:

团队黄色= 12岁的男孩;
团队红色= 13岁的女孩;
蓝队= 11岁的男孩;

这意味着不正确的注册人是Sarah(性别不正确,年龄正确),Jack(性别和年龄不正确)和Mary都应该被包含在查询结果中。

但是,我正在努力创建一个SQL查询,该查询会考虑来自多个领域的条件(同时将团队与性别和年龄进行比较)+同时进行多组比较(查找)同时参加3支队伍的参赛者不正确。)

非常感谢帮助!

5 个答案:

答案 0 :(得分:4)

您没有说明您的DBMS,因此这是ANSI SQL:

只需选择不符合任何规则的所有行:

select *
from participants
where (team, gender, age) not in (  ('Yellow', 'M', 12), 
                                    ('Red', 'F', 13), 
                                    ('Blue', 'M', 11) );

在线示例:http://rextester.com/ZTEON26060

答案 1 :(得分:1)

这里最重要的是你必须将你的团队规则转换成某种适当的数据结构。您可以将其放入表中,或使用派生表,如下所示:

select *
from participants as p
where
    not exists (
        select *
        from (values
              ('Yellow', 'M', 12),
              ('Red', 'F', 13),
              ('Blue', 'M', 11)
        ) as t(Team, Gender, Age)
        where
            t.Team = p.Team and
            t.Gender = p.Gender and
            t.Age = p.Age
    )

或者您可以检查正确的团队,然后与当前团队进行比较:

select
    p.*, t.Team as Correct_Team
from participants as p
    left join (values
        ('Yellow', 'M', 12),
        ('Red', 'F', 13),
        ('Blue', 'M', 11)
    ) as t(Team, Gender, Age) on
        t.Gender = p.Gender and
        t.Age = p.Age    

<强> sql fiddle demo

答案 2 :(得分:0)

你可以试试这个:

Select 
Name,
Gender,
Age,
Team AS Chosen_team,
Case when Gender='M' and Age=12 Then 'Yellow'
     when Gender='F' and Age=13 then 'Red'
     when gender='M' and Age=11 then 'Blue'
End as Ideal_team,
Case when Chosen_team <> Ideal_team then 'FALSE' ELSE 'TRUE'
from your_table;

现在选择值为false的记录。你会得到你的清单。

答案 3 :(得分:0)

您可以使用orand的组合来执行此操作。

select * from yourtable
where (team ='Yellow' and not (gender = 'M' and age = 12))
or (team ='Red' and not (gender = 'F' and age = 13))
or (team ='Blue' and not (gender = 'M' and age = 11))

答案 4 :(得分:0)

有一些事情没有提及你的团队限制:

  • 同一个团队可以有不同的年龄和性别组合吗?
  • 任何相同的年龄和性别组合可以匹配多个团队吗?
  • 有效团队是否会涵盖参与者年龄和性别的所有排列?

由于没有说明,我将提供一个通用的解决方案,可以轻松扩展有效的团队。并且查询将返回与至少一个有效团队不匹配的所有参与者。 (注意:特定参与者可能没有有效的团队。)

方法:

  • 将有效组合放入某些临时(甚至持久)表中(我将使用CTE)。
  • 选择在“有效团队”表格中找不到匹配的年龄,性别和团队的所有参与者。

如果您的RDBMS不支持CTE,则下面的ValidTeams的CTE可以很容易地用表替换。注意:如果有许多有效性别/年龄/团队的排列,则单独的表格会更好。

;WITH ValidTeams AS (
    SELECT  'Yellow' AS Team, 'M' AS Gender, 12 AS Age
    UNION ALL SELECT 'Red', 'F', 13
    UNION ALL SELECT 'Blue', 'M', 11
)
SELECT  Name, Gender, Age, Team AS InvalidTeam
FROM    Participants p
WHERE   NOT EXISTS (
    SELECT  *
    FROM    ValidTeams v
    WHERE   v.Gender = p.Gender
        AND v.Age = p.Age
        AND v.Team = p.Team
    )