2010-07-13 98 views
0

我在我的数据库中有一个assignment表。我也有一个assignment_notes表,其中引用了assignment表。该表中可以存在多行。如果条件匹配,则SQL返回true

当我选择所有的作业时,我想检查一下这个作业是否存在一些注释。我只想要一个真实的/虚假的回报。

是否有可能做这样的事情(伪):

选择所有任务;如果赋值 有assign_notes HasNotes = true;否则 HasNotes = false。

我希望我做这个很清楚 - 我不是在解释编程的东西;-)

+0

对于SQL Server的问题,如果您可以让人们知道您使用的是哪个版本,那么它会有所帮助 - 某些语言功能在旧版本中不可用。谢谢:) – Meff 2010-07-13 10:32:17

回答

1
DECLARE @Assignments TABLE 
(
    Id INT NOT NULL IDENTITY(1,1) PRIMARY KEY, 
    Name VARCHAR(30) NOT NULL 
) 

DECLARE @AssignmentNotes TABLE 
(
    Id INT NOT NULL IDENTITY(1,1) PRIMARY KEY, 
    AssignmentId INT NOT NULL, 
    Note VARCHAR(MAX) 
) 

INSERT INTO @Assignments(Name) VALUES('Biology') 
INSERT INTO @Assignments(Name) VALUES('Chemistry') 

INSERT INTO @AssignmentNotes (AssignmentId, Note) VALUES(1, 'Studies on DNA') 
INSERT INTO @AssignmentNotes (AssignmentId, Note) VALUES(1, 'Evolution notes from Darwin') 

SELECT 
    A.*, 
    CASE WHEN COUNT(AN.Id) > 0 THEN 1 ELSE 0 END AS HasNotes  
FROM  
    @Assignments AS A 
    LEFT JOIN 
    @AssignmentNotes AS AN 
    ON A.Id = AN.AssignmentId 
GROUP BY 
    A.Id, 
    A.Name 
1

没有SQL服务器准备测试,但这样的查询应该工作:

SELECT A.*, 
    CAST(
    CASE (SELECT TOP 1 AssignmentNotes_ID 
      FROM AssignmentNotes AN 
      WHERE AN.AssignmentID = A.AssignmentID) 
     WHEN NULL THEN 0 ELSE 1 END 
    AS BIT) AS HasNotes 
FROM Assignments A 
+0

“NULL”不起作用 - 它会一直返回“1” – janhartmann 2010-07-13 10:36:18

1
SELECT a.*, 
    (SELECT COUNT(*) 
    FROM assignment_notes an 
    WHERE an.assignmentid = a.id) as NumNotes 
FROM Assignment a 

这将为您提供该作业的笔记数量。

0

这种方法意味着您不需要大量的GROUP BY语句,因为返回大量的Assignment字段。

SELECT Assignment.*, 
CAST(CASE WHEN NotesQty>0 THEN 1 ELSE 0 END as bit) AS HasNotes 
FROM Assignment 
LEFT JOIN 
(SELECT AssignmentId,COUNT(*) AS NotesQty 
FROM assignment_notes 
GROUP BY AssignmentId) as Assignment_NotesQty 
ON Assignment_NotesQty.AssignmentId=Assignment.AssignmentId 
相关问题