SQL возвращает true, если критерии соответствуют - PullRequest
0 голосов
/ 13 июля 2010

У меня есть таблица assignment в моей базе данных.У меня также есть таблица assignment_notes, которая имеет ссылку на таблицу assignment.В этой таблице может быть несколько строк.

Когда я выбираю все свои назначения, я хочу проверить, существуют ли какие-либо примечания к этому назначению.И все, что я хочу, это возвращение true / false.

Можно ли сделать что-то вроде (псевдо):

Выбрать все назначения;если назначение имеет assignment_notes HasNotes = true;еще HasNotes = false.

Надеюсь, я достаточно ясно объяснил - я не очень хорош в объяснении вещей программирования; -)

Ответы [ 5 ]

1 голос
/ 13 июля 2010
SELECT a.*, 
    (SELECT COUNT(*) 
     FROM assignment_notes an 
     WHERE an.assignmentid = a.id) as NumNotes
FROM Assignment a

Это даст вам количество заметок с этим назначением.

1 голос
/ 13 июля 2010

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
1 голос
/ 13 июля 2010
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
0 голосов
/ 13 июля 2010

Этот подход означает, что вам не нужен большой оператор GROUP BY в результате возврата большого количества полей назначения.

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
0 голосов
/ 13 июля 2010

Вы можете перевести свой псевдокод в SQL, если используете оператор case.На MSDN: http://msdn.microsoft.com/en-us/library/ms181765.aspx

И еще одна статья на всякий случай: http://www.devx.com/tips/Tip/15633

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...