2016-12-19 74 views
1

執行存儲過程我有四個表:創建和SQL Server

  • dbo.Projects(ID,項目名,區,PaymentSystem,Districts.id,purpose.id,types.id等)
  • dbo.Districts(ID,DistrictsName)
  • dbo.Purpose(ID,PurposeName) - 擁有住宅&商業
  • dbo.Types(ID,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而不重複或具有不同的值,ia在每個區域還有一個項目記錄記錄。這是我想顯示:

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列。你爲什麼要構建一個新的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