sql-server - 在多个where条件中选择具有最大值的行
问题描述
我根据此页面编辑了以下查询:
选择查询:
select
Users.Id, Users.[Name], Users.Family, Users.BirthDate,
Users.Mobile, Users.[Description], Users.Email,
Users.UserName, Users.fatherName,
Users.archiveNumber, Users.[Address], Users.IsMarried,
Users.Mazhab,
Cities.CityName, Religions.PersianName, Users.Date_insert,
Users.ImageName,
MaghtaeTahsilis.[Name] as MaghtaeTahsilisName,
FieldStudies.[Name] as FieldStudiesName,
Eductionals.Institute, Eductionals.Moaddal,
Eductionals.FromYear, Eductionals.ToYear
from
Users
left outer join
Eductionals on Users.id = Eductionals.UserID
left outer join
MaghtaeTahsilis on Eductionals.MaghtaeID = MaghtaeTahsilis.ID
left outer join
Cities on Users.City_Id = Cities.Id
left outer join
Religions on Users.Relegion_ID = Religions.ID
left outer join
FieldStudies on Eductionals.FieldStudy_ID = FieldStudies.ID
where
Users.UserName = @code_melli
and Eductionals.MaghtaeID = (select MAX(MaghtaeID) from Eductionals
where Eductionals.UserID = Users.Id)
此命令在选择MAX
值时正常工作,但如果以下语句有NULL
值,则不返回任何行。NULL
如果是的话,我想显示价值NULL
。
解决方案
你left outer join
的 s 被条件变成了inner join
s where
。您的查询应如下所示:
select u.Id, u.[Name], u.Family, u.BirthDate, u.Mobile, u.[Description], u.Email, u.UserName, u.fatherName,
u.archiveNumber, u.[Address], u.IsMarried, u.Mazhab, c.CityName, r.PersianName, u.Date_insert, u.ImageName,
mt.[Name] As MaghtaeTahsilisName, fs.[Name] As FieldStudiesName, e.Institute, e.Moaddal, e.FromYear, e.ToYear
from Users u left outer join
Eductionals e
on u.id = e.UserID and
e.MaghtaeID = (select MAX(e2.MaghtaeID)
from Eductionals e2
where e2.UserID = u.Id
) left outer join
MaghtaeTahsilis mt
on e.MaghtaeID = mt.ID left outer join
Cities c
on u.City_Id = c.Id left outer join
Religions r
on u.Relegion_ID = r.ID left outer join
FieldStudies fs
on e.FieldStudy_ID = fs.ID
where u.UserName = @code_melli ;
第一个表的条件——在left join
s 链中应该在where
子句中。在on
子句中的后续表上。
您会注意到我还添加了表别名,因此查询更易于编写和阅读。
您还可以使用窗口函数:
from Users u left outer join
(select e2.*,
row_number() over (partition by e2.userId order by e2.MaghtaeID desc) as seqnum
from Eductionals e2
) e
on u.id = e.UserID and
e.seqnum = 1 left outer join
. . .
推荐阅读
- postgresql - 在 JOOQ 的 IN 子句中使用 Postgres VALUES 函数
- unity3d - unity 2021 无法创建单个 Tile 或可以但文档让我感到困惑
- c# - 强制规范流测试失败
- javascript - 使用 ThreeJS 进行世界旋转
- java - Java 方法只是停止运行
- crystal-reports - Crystal Reports - 如果详细信息部分为空,如何抑制页眉?
- c++ - C++ 比较运算符重载 const 与非 const 行为
- google-sheets - 谷歌表格 - 查询导入范围选择今天的日期
- javascript - 有没有办法用另一个 CSS 元素切换复选框输入?
- android - Android 推送通知:通知中未显示图标。仅显示方形背景