SQL noobie在这里,尝试了我的运气谷歌搜索,但空洞或没有知道正确的关键字。尽管如此,在所有这些高级问题之间感到相当尴尬,但仍然希望能够获得解决方案并学习。
假设我们有一张表格,代表不同球队参加儿童体育锦标赛的参赛者。
参与者表:
我们的目标是选择选择了错误团队的参与者。让我们假设团队的条件是这样的:
团队黄色= 12岁的男孩;
团队红色= 13岁的女孩;
蓝队= 11岁的男孩;
这意味着不正确的注册人是Sarah(性别不正确,年龄正确),Jack(性别和年龄不正确)和Mary都应该被包含在查询结果中。
但是,我正在努力创建一个SQL查询,该查询会考虑来自多个领域的条件(同时将团队与性别和年龄进行比较)+同时进行多组比较(查找)同时参加3支队伍的参赛者不正确。)
非常感谢帮助!
答案 0 :(得分:4)
您没有说明您的DBMS,因此这是ANSI SQL:
只需选择不符合任何规则的所有行:
select *
from participants
where (team, gender, age) not in ( ('Yellow', 'M', 12),
('Red', 'F', 13),
('Blue', 'M', 11) );
答案 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)
您可以使用or
和and
的组合来执行此操作。
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)
有一些事情没有提及你的团队限制:
由于没有说明,我将提供一个通用的解决方案,可以轻松扩展有效的团队。并且查询将返回与至少一个有效团队不匹配的所有参与者。 (注意:特定参与者可能没有有效的团队。)
方法:
如果您的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
)