我需要比较数据并返回其中一列值低于另一列的行,问题是每次值都不同,最好在示例中显示,我有一个问题来描述,在理论上:
所以我需要选择每个男孩比游泳更喜欢的东西(sort order描述喜欢的顺序,1 =最喜欢的)。我有两个表格,一个是孩子的名字和性别,第二个是孩子喜欢的运动,如下所示。
每个孩子的顺序可能不同,我总是更需要他们喜欢什么而不是游泳的结果。
孩子表:
免责声明,我没有运行过这个,但这是我要采取的方法:
SELECT kids.name
, other_sports.sport
FROM kids
JOIN kids_sports swimming
ON kids.id = swimming.kid_id
AND sport = 'Swimming'
LEFT JOIN kids_sports other_sports
ON kids.id = other_sports.kid_id
AND other_sports.[ORDER] > swimming.[order];
你想知道每个孩子的游泳顺序是什么,通过连接到体育表,然后使用游泳的顺序,从other_sports中选择所有有更高的顺序值。
我使用[ ]
围绕order
作为SQL server的关键字。
从风格上讲,我可以把AND swimming.sport = 'Swimming'
放在where子句中,但我觉得这更能说明我在这里要做的事情。
我使用左连接,所以如果孩子最喜欢的运动是游泳,他们仍然会出现在你的结果与null最喜欢的运动。将其设置为内连接将隐藏它,这取决于后面的内容
听起来像是课堂练习。下面是可能适合赋值的伪代码:
select ...
from kids inner join kid sports ...
where order < (
select order from kid sports ks2
where <correlated match on kid id> and ks2.sport = 'swimming'
);
高级方法:
with data as (
select *,
min(case when sport = 'swimming' then order end) over (partition by k.id) as swim_pref
from kids k inner join kids_sports is on ks.Kid_ID = k.ID
)
select * from data
where order < swim_pref;