簡體   English   中英

從兩個表中選擇所有列,按表1中的所有列和表2中的特定列分組

[英]Select all columns from two tables grouping by all columns in table1 and specific column in table2

我的表結構如下

    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查詢全選,其中Count(MemberId)= 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()返回正確的值。

而且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
                 );

還有更多選擇!

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
)

你會怎么辦授予這項任務? 可能:首先查找唯一的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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM