【问题标题】:Select all columns from two tables grouping by all columns in table1 and specific column in table2从两个表中选择所有列,按table1中的所有列和table2中的特定列分组
【发布时间】:2016-05-17 14:53:54
【问题描述】:

我的表结构如下所示

    TblMemberInfo          |         TblCarInfo
 MemberID   Name           |         Id     MemberId     CarNumber
    1       Sandeep        |         1         2            1234
    2       Vishal         |         2         1            1111
    3       John           |         3         4            2458
    4       Kevin          |         4         2            1296
    5       Devid          |         5         4            7878
                           |         6         3            4859

我需要查询 select all from TblMemberInfo,TblCarInfo where Count(MemberId)=1

      MemberId    Name        CarNumber
        1        Sandeep        1111
        3        John           4859

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这是一种方法:

    select mi.MemberID, mi.Name, min(CarNumber) as CarNumber
    from TblMemberInfo mi join
         TblCarInfo ci
         on mi.MemberID = ci.MemberID
    group by mi.MemberID, mi.Name
    having count(*) = 1;
    

    这是可行的,因为组中只有一行,min() 返回正确的值。

    另一种方法使用not exists

    select mi.MemberID, mi.Name, ci.CarNumber
    from TblMemberInfo mi join
         TblCarInfo ci
         on mi.MemberID = ci.MemberID
    where not exists (select 1
                      from TblCarInfo ci2
                      where ci2.MemberID = ci.MemberID and ci2.id <> ci.id
                     );
    

    【讨论】:

      【解决方案2】:

      更多选择!

      select mi.MemberId, mi.Name, ci.CarNumber
      from TblMemberInfo mi 
      join TblCarInfo ci on 
         mi.MemberId = ci.MemberId
      group by mi.MemberId, mi.Name, ci.CarNumber
      having min(ci.Id) = max(ci.Id)
      

      如果您还需要引入许多其他列,则使用子查询检索单个 MemberId's 是个好主意

      select mi.MemberId, mi.Name, ci.CarNumber
      from TblMemberInfo mi   
      join TblCarInfo ci on 
         mi.MemberId = ci.MemberId
      where mi.MemberId in
      (
         select MemberId     
         from TblCarInfo 
         group by MemberId
         having count(*) = 1
      )
      

      【讨论】:

        【解决方案3】:

        会做什么?可能:先找到唯一的 TblCarInfo 成员条目,然后查找成员名称。因此,请告诉 DBMS 这样做:

        select m.memberid, m.name, c.carnumber
        from
        (
          select memberid, min(carnumber) as carnumber
          from tblcarinfo
          group by memberid
          having count(*) = 1
        ) c
        join tblmemberinfo m on m.memberid = c.memberid;
        

        或相同的方法,但在 select 子句中使用子查询而不是连接:

        select
          c.memberid, 
          (select m.name from tblmemberinfo m where m.memberid = c.memberid) as name,
          c.carnumber
        from
        (
          select memberid, min(carnumber) as carnumber
          from tblcarinfo
          group by memberid
          having count(*) = 1
        ) c;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-10
          • 1970-01-01
          • 1970-01-01
          • 2016-01-15
          • 2019-05-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多