Многофункциональный выбор SQL Server с IF-Else - PullRequest
1 голос
/ 23 января 2012

У меня есть следующий sql, который возвращает проекты и связанных подрядчиков, а также информацию о размере документа из трех разных таблиц.Последовательность: сначала в систему вводятся подрядчики, затем вводятся проекты для каждого подрядчика, при этом вводятся размеры документов (листов).Пока все хорошо: следующий sql возвращает все проекты вместе с соответствующими подрядчиками и ведомостями в порядке:

SELECT 
   dbo.generalcontractors.name,
   dbo.Projects.*,
   dbo.sheets.sheetsize,
   dbo.sheets.sheetid
FROM 
   dbo.generalcontractors 
INNER JOIN dbo.Projects ON (dbo.generalcontractors.uid = dbo.Projects.generalcontractorid)
INNER JOIN dbo.sheets ON (dbo.Projects.sheetid = dbo.sheets.sheetid) 
ORDER BY 
    dbo.Projects.projectdate DESC

Теперь необходимо, чтобы документы для отдельных проектов были внесены в таблицу ProjectDocuments.У меня есть следующий код, который проверяет наличие документов в таблице ProjectsDocuments и возвращает соответствующие значения;В настоящее время идентификатор проекта жестко запрограммирован, и он работает.

Вопрос: как я могу объединить следующий SQL в SQL выше?Я ищу один результат запроса, который покажет все совпадающие строки из таблицы ProjectsDocument, а если совпадения не будет, то покажет «Не найдено».

Это для SQL Server 2005.

Спасибо!

IF (SELECT COUNT(*) FROM dbo.projectsdocuments, dbo.Projects 
    WHERE projectsdocuments.projectid = Projects.projectid 
    AND Projects.projectid = 5) > 0 
    SELECT * 
    FROM projectsdocuments 
ELSE 
    SELECT 'Not Found' AS HighPrice

Ответы [ 2 ]

1 голос
/ 23 января 2012

Одним из вариантов будет просто добавить таблицу ProjectDocuments к вашему запросу, используя LEFT OUTER JOIN.

Если в таблице ProjectDocuments нет совпадающих строк - тогда все столбцы из этоготаблица будет NULL - поэтому при захвате одного из столбцов и использовании конструкции ISNULL(<colname>, 'Not Found') будет отображаться «Не найдено», если в ProjectDocuments не найдено значений:

SELECT 
   gc.name,
   pr.ProjectDate, pr.Column1, pr.Column2, ....., pr.ColumnN,
   s.sheetsize,
   s.sheetid,
   ISNULL(pd.Name, 'Not Found') AS 'ProjectDocumentName',
   pd.Column1, ..., pd.ColumnN
FROM 
   dbo.GeneralContractors gc 
INNER JOIN 
   dbo.Projects pr ON gc.uid = pr.GeneralContractorID
INNER JOIN 
   dbo.Sheets s ON pr.SheetID = s.SheetID
LEFT OUTER JOIN
   dbo.ProjectsDocuments pd ON pr.ProjectID = pd.ProjectID
ORDER BY 
    pr.ProjectDate DESC

Две вещи, которые я бы порекомендовал сделать:

  • использовать значимые псевдонимы таблиц (например, gc для GeneralContractor, pr для Project и т. Д.) - это значительно упрощает чтение запросов ....

  • явно указывает столбцы, которые вы хотите извлечь из таблиц, - что предотвращает нежелательные сюрпризыкогда в вашей таблице неожиданно появляется еще пять BLOB-столбцов, даже если они вам не нужны!

1 голос
/ 23 января 2012

Вы должны присоединиться к ProjectDocuments и выбрать соответствующие поля. Используйте ISNULL для замены одного из этих полей на «Не найдено», если нет соответствующих документов.

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