2016-12-19 7 views
1

У меня есть четыре таблицы:Создание и выполнение хранимой процедуры в SQL Server

  • dbo.Projects (идентификатор, ProjectName, районы, PaymentSystem, Districts.id, purpose.id, types.id и т.д.)
  • dbo.Districts (ID, DistrictsName)
  • dbo.Purpose (идентификатор, PurposeName) - имеет жилые & коммерческие
  • dbo.Types (идентификатор, typName)

Я хочу, чтобы выбрать DistrictsName где PurposeName = 'жилой'

Я попробовал эту процедуру:

CREATE PROCEDURE [dbo].[SearchResidentialProjects] 
AS 
SELECT 
    dbo.Projects.ID, 
    dbo.Districts.DistrictName, 
    dbo.Purpose.PurposeName 
FROM 
    dbo.Projects 
INNER JOIN 
    dbo.Purpose ON dbo.Projects.PurposeID = dbo.Purpose.ID 
INNER JOIN 
    dbo.Districts ON dbo.Projects.DistrictID = dbo.Districts.ID 
WHERE 
    dbo.Purpose.PurposeName = N'Residential' 

это является результатом этой процедуры:

ID DistrictsName PurposeName 
 
1 District1 residential 
 
2 District1 residential 
 
3 District2 residential 
 
4 District2 residential

я хотите отобразить DistrictsName без дублирования или с разными значениями, у нас есть еще один проект в каждом округе записи. это то, что я хочу, чтобы отобразить:

ID DistrictsName PurposeName 
 
1 District1 residential 
 
2 District2 residential

как я получить этот результат, любая помощь приветствуется.

+0

Какова цель столбца ID в предпочитаемом результате? Вы не можете связать его с исходной записью. Вам просто нужен какой-то счет? – JeffO

ответ

2

Почему люди используют хранимые процедуры, когда виды гораздо более уместны? Я этого никогда не понимал. Кажется, это характерно для пользователей SQL Server.

В любом случае, вы можете делать то, что вы хотите с агрегацией:

SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) as id, 
     d.DistrictName, p.PurposeName 
FROM dbo.Projects pr INNER JOIN 
    dbo.Purpose pu 
    ON pr.PurposeID = pu.ID INNER JOIN 
    dbo.Districts d 
    ON pr.DistrictID = d.ID 
WHERE pu.PurposeName = N'Residential' 
GROUP BY d.DistrictName, p.PurposeName; 

Использование псевдонимов таблиц делает запрос гораздо проще писать и читать.

Кроме того, я не понимаю, что вывод id. Почему вы хотите построить новый идентификатор? В любом случае, это то, что предлагают ваши данные.

+0

Большое спасибо – hashim

+0

Я не встречал ни одного пользователя SQL Server, который предпочитает хранимые процедуры для просмотра. Я * * видел вопросы от пользователей других баз данных, перенесенных на SQL Server, которые считают, что им нужны хранимые процедуры. Это как если бы люди поняли, что «если это на сервере, это хранимая процедура». Или они укушены древней ошибкой, что как-то хранимые процедуры быстрее, потому что они хранятся в процедурах ... –

-1

Используйте DISTINCT заявления для удаления дубликатов:

CREATE PROCEDURE [dbo].[SearchResidentialProjects] 
AS 
SELECT DISTINCT 
    dbo.Projects.ID, 
    dbo.Districts.DistrictName, 
    dbo.Purpose.PurposeName 
FROM 
    dbo.Projects 
INNER JOIN 
    dbo.Purpose ON dbo.Projects.PurposeID = dbo.Purpose.ID 
INNER JOIN 
    dbo.Districts ON dbo.Projects.DistrictID = dbo.Districts.ID 
WHERE 
    dbo.Purpose.PurposeName = N'Residential' 
+0

'distinct' здесь не поможет. потому что 'dbo.Projects.ID' уникален. – Sankar

Смежные вопросы