2013-08-23 40 views
0

主表:加入主機和子女,只有子表的行數

CREATE TABLE [dbo].[db_Chat](
    [ChatID] [int] IDENTITY(1,1) NOT NULL, 
    [MemberID] [int] NOT NULL, 
    [MsgText] [nvarchar](300) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL, 
    [DateCreated] [smalldatetime] NOT NULL, 
CONSTRAINT [PK_db_Chat] PRIMARY KEY CLUSTERED 
(
    [ChatID] ASC 
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] 
) ON [PRIMARY] 

子表:

CREATE TABLE [dbo].[db_Chat_Read](
    [ChatReadID] [int] IDENTITY(1,1) NOT NULL, 
    [MemberID] [int] NOT NULL, 
    [ChatID] [int] NOT NULL, 
    [DateCreated] [smalldatetime] NOT NULL, 
CONSTRAINT [PK_db_Chat_Read] PRIMARY KEY CLUSTERED 
(
    [ChatReadID] ASC 
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] 
) ON [PRIMARY] 

我要加入兩個表並顯示孩子的行數表,如果沒有選擇行,那麼它可以顯示零。

我知道下面的代碼工作正常。

select c.ChatID, COUNT(*) as ACount from db_chat c 
left join db_Chat_Read r 
on c.ChatID = r.ChatID 
where c.ChatGroupID=2 
GROUP BY c.ChatID 

但我需要這樣的事情在一個單一的SQL代碼,下面的SQL代碼是無效的,但它顯示什麼結果,我想:我需要與子表的唯一行計數主表的全領域。

select c.*, COUNT(r.*) from db_chat c 
left join db_Chat_Read r 
on c.ChatID = r.ChatID 
where c.ChatGroupID=2 

謝謝〜!

回答

3

你可以做你想要使用子查詢的內容:

select c.*, 
     (select COUNT(*) from db_Chat_Read r where c.ChatID = r.ChatId 
     ) as ACount 
from db_chat c 
where c.ChatGroupID = 2; 

不過,我建議把列在group by

編輯:

您還可以使用額外的join做到這一點:

select c.*, coalesce(ACount, 0) as ACount 
from db_chat c left join 
    (select r.ChatId, count(*) as ACount 
     from db_Chat_Read r 
     group by r.ChatId 
    ) r 
    on c.ChatID = r.ChatID 
where c.ChatGroupID = 2; 
+0

我更喜歡第一個,但無論哪種都ok –

+0

如果數據量是巨大的,哪一個更有效?如果我沒有錯,第一個更有效率? –

+0

@HamiltonWang。 。 。假設where子句具有高選擇性(意味着許多行被過濾掉),並且所有或幾乎所有的「聊天」都具有「聊天讀取」記錄,第一種可能更有效。使用'db_Chat_Read(ChadId)'的索引會更有效率。 –