Sql 从按表1中的所有列和表2中的特定列分组的两个表中选择所有列
我的桌子结构如下所示Sql 从按表1中的所有列和表2中的特定列分组的两个表中选择所有列,sql,sql-server,Sql,Sql Server,我的桌子结构如下所示 TblMemberInfo | TblCarInfo MemberID Name | Id MemberId CarNumber 1 Sandeep | 1 2 1234 2 Vishal | 2 1
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
我需要从TblMemberInfo、TblCarInfo中查询select all,其中CountMemberId=1
MemberId Name CarNumber
1 Sandeep 1111
3 John 4859
这里有一种方法:
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返回正确的值
不存在替代方法使用:
还有几个选择
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是一个好主意
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
)
考虑到这项任务,你会怎么做?可能:首先查找唯一的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子句中使用子查询而不是join:
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;
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;