2016-12-19 75 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