代码之家  ›  专栏  ›  技术社区  ›  janhartmann

如果条件匹配,SQL返回true

  •  0
  • janhartmann  · 技术社区  · 14 年前

    assignment 数据库中的表。我也有一个 assignment_notes 表,其中引用了 分配 桌子。此表中可以存在多行。

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

    是否可以执行以下操作(伪):

    has赋值\u notes HasNotes=true;其他的

    5 回复  |  直到 14 年前
        1
  •  1
  •   Meff    14 年前
    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
    
        2
  •  1
  •   devio    14 年前

    没有准备好测试SQL Server,但这样的查询应该可以工作:

    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
    
        3
  •  1
  •   Chris Diver    14 年前
    SELECT a.*, 
        (SELECT COUNT(*) 
         FROM assignment_notes an 
         WHERE an.assignmentid = a.id) as NumNotes
    FROM Assignment a
    

    这会给你那作业的笔记数。

        4
  •  0
  •   Rob    14 年前

    如果使用case语句,可以将伪代码转换为SQL。在MSDN上: http://msdn.microsoft.com/en-us/library/ms181765.aspx

    还有一篇文章以防万一: http://www.devx.com/tips/Tip/15633

        5
  •  0
  •   Joel Mansford    14 年前

    这种方法意味着您不需要由于返回大量赋值字段而使用庞大的groupby语句。

    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