【问题标题】:Select row with max value in multiple where condition在多个where条件中选择具有最大值的行
【发布时间】:2019-01-26 21:14:25
【问题描述】:

我根据此页面编辑了以下查询:

Selecting a Record With MAX Value

选择查询:

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 值。

【问题讨论】:

    标签: sql-server tsql select


    【解决方案1】:

    where 条件将您的 left outer joins 转换为 inner joins。您的查询应如下所示:

    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 joins 链中的条件应该在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
         . . .
    

    【讨论】:

      【解决方案2】:

      第二个查询返回NULL时返回零记录的原因是,当第二个查询返回NULL时,你的SQL语法变成这样

      And Eductionals.MaghtaeID=NULL
      

      并且可能 Dbtable Educationals 为字段 MaghtaeID 保存 NULL 值。 所以 SQL 在语法上失败,因此返回零记录。 检查 NULL 值的正确语法是

      And Eductionals.MaghtaeID is NULL
      

      所以请修改查询中的 where 条件,如下所示,这将返回所需的结果。

      where Users.UserName = @code_melli AND isnull(Eductionals.MaghtaeID,0) = isnull((select MAX(MaghtaeID) from Eductionals where Eductionals.UserID = Users.Id),0)
      

      【讨论】:

        猜你喜欢
        • 2020-07-11
        • 1970-01-01
        • 2013-11-18
        • 1970-01-01
        • 2017-12-17
        • 2020-05-20
        • 2021-07-23
        • 2020-10-26
        • 2013-04-13
        相关资源
        最近更新 更多