2017-07-29 53 views
0

我有數據庫具有以下表無法找出SQL查詢任務

登錄表:

CREATE TABLE [dbo].[Login] 
(
    [username] [nvarchar](100) NOT NULL, 
    [password] [nvarchar](50) NOT NULL, 
    [user_type] [nchar](10) NOT NULL, 
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [isDelete] [bit] NOT NULL, 
) 

測試表:

CREATE TABLE [dbo].[Test] 
(
    [TestId] [int] IDENTITY(1,1) NOT NULL, 
    [TestName] [nvarchar](100) NOT NULL, 
    [UserId] [int] NOT NULL, 
    [isDelete] [bit] NOT NULL, 
) 

問題表:

CREATE TABLE [dbo].[Questions] 
(
    [Qid] [int] IDENTITY(1,1) NOT NULL, 
    [Tid] [int] NOT NULL, 
    [Qtype] [int] NOT NULL, 
    [Question] [nvarchar](max) NOT NULL, 
    [isDelete] [bit] NULL, 
) 
  • Login.id是一個外鍵和引用Test.UserId
  • Test.TestId是外鍵和引用Questions.Tid

我的問題是:我想獲取Login.usernameTest.TestName和每個測試題的數量,例如我希望所有測試都存在,每個測試的問題數量(即使爲0)。

我嘗試下面的查詢

select 
    Test.TestId, Test.TestName, COUNT(Questions.Tid) as 'No.Of Questions' 
from 
    Test, Questions 
where 
    Test.TestId = Questions.Tid and 
    Questions.isDelete <> 'true' 
group by 
    TestId, TestName 

但此查詢只返回試驗,其中至少一個問題是,目前在問表。

我想要所有的測試必修課,然後每個測試的問題。

+0

這是MySQL還是SQL Server?請不要同時使用這兩個標籤,因爲語法通常略微不同,而且您只是浪費了人們的時間。 –

+0

它是Sql Server。對不起包括這兩個標籤 – SAM

+0

[不良習慣踢:使用舊式聯接](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old -style-joins.aspx) - 在ANSI - ** 92 ** SQL標準中(** 25年*),舊式*逗號分隔的表*樣式列表已替換爲* proper * ANSI'JOIN'語法*之前),其使用是不鼓勵的 –

回答

0

你需要使用Left outer join

select T.TestId,T.TestName,COUNT(Q.Tid) as [No.Of Questions] 
from Test t 
Left Join Questions q 
     On Q.isDelete<>'true' 
     and T.TestId=Q.Tid 
group by TestId,TestName 

當前的語法就像Inner Join。這就是你得到的測試沒有任何問題的原因