2016-11-04 62 views
1

SQL noobie在这里,试着用我的搜索引擎搜索一下,但是空了或者不知道正确的关键字。尽管如此,在所有这些高级问题之间感觉很尴尬,但仍然希望得到解决方案和学习。组合条件下的SELECT查询

假设我们有一个表格代表不同团队参加儿童体育比赛。

参与者表:

enter image description here

我们的目标是要选择的是选择了一个错误的球队参加。让我们假设,对于球队的情况是这样:

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

这将意味着不正确的注册人萨拉(不正确的性别,年龄正确),杰克(不正确的性别和年龄)和玛丽谁所有,因此应包含在查询的结果。

但是我很努力地创建一个SQL查询来考虑来自多个领域的条件(同时比较团队对性别和年龄)+同时完成多个比较集合(寻找不正确的参加者来自3个团队)。

非常感谢帮助!

+0

看看动态SQLl命令 – McNets

+1

@mcNets这个问题并不需要动态SQL –

+1

这个问题不需要你使用的是哪个DBMS动态SQL @mcNets –

回答

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选择的记录。你会得到你的名单。

+0

我知道它没有在要求中说明,但这确实认为没有选择。即具体的年龄/性别组合只允许1个可能的团队。 (在这种情况下,整个练习似乎没有多大意义。) –

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)) 
+0

如果您需要支持同一团队允许多个年龄/性别组合,那么这个过程有点麻烦。 –

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

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

+0

这是一个非常好的!至少在MySQL和PostgreSQL –

+0

从来没有见过这样的事情据我所知的作品,遗憾的是不打算在SQL Server工作2008 –

+0

@RomanPekar:这是概念上一样'其中(A,B)在(选择X,Y从...)' –

0

有你有没有对你的团队限制提到的几件事情:

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

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

方法:

  • 将有效组合中的某些种类的临时(甚至永久)表(I”将使用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 
    )