2016-06-07 72 views
1

我有一个兽医SQL服务器更换门牌号码,和我建立在ASP.NET中使用SSMS的存储过程。我有一个有效的SQL查询,可以获取两个日期之间的所有临床案例:SQL:我想与它的正式名称

USE [vetDatabase_Wizard] 
GO 
ALTER PROCEDURE sp_GetNewCases (@startDate datetime, @endDate datetime) 
AS 
BEGIN 
    SELECT caseID,building FROM tblCases 
    WHERE dateOpened BETWEEN @startDate and @endDate 
END 
GO 
EXEC sp_GetNewCases '2015-01-01', '2015-08-30' 

感谢在线社区,它正在运行! :)

这里是输出:

caseID building 
1  3 
2  3 
3  2 
... 

当我开始学习如何使SQL数据库,我被告知,这是存储建筑物名称与相应数量以节省存储空间很好的做法。例如,tblBuildings:

buildingID  name 
1    GSC 
2    RVH 
3    MMD 
... 

我有7个建筑名称。我想修改我上面的存储过程,这样我就可以用一些JavaScript数据可视化库使用输出(JSON格式):

caseID   name 
1    MMD 
2    MMD 
3    RVH 
... 

非常感谢您的帮助!

+0

您在同一时间混合几个问题。你问关于数据库设计,存储过程,JSON或ASP?尝试具体,否则太宽泛无法回答。请阅读[** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t这里是[** START **](http ://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/),了解如何提高您的问题质量并获得更好的答案。 –

回答

2

首先,您应该将tblCases字段名称building更改为building_id,以便与您的其他表保持一致。

然后将两个表一起加入,以便您可以返回building_name,如果不需要,可以从结果中删除building_id

BEGIN 
    SELECT C.caseID, B.building_id, B.Name 
    FROM tblCases C 
    JOIN tblBuilding B 
     ON C.building_id = B.building_id 
    WHERE dateOpened BETWEEN @startDate and @endDate 
END 
+0

嗨!非常感谢您的帮助!我学到了新东西! :D此外,我会小心提出更好的问题。我不知道我们可以使用字母(即B,C)以这种灵活的方式来识别字段。我还想问你:我不需要写C.dateOpened,因为我们提到“FROM tblCases”,对吧? – Johnathan

+1

你应该写'C.dateOpened'来让你的代码对下一个人更具可读性。但你不必。在'building_id'的情况下,你**必须**,因为db不知道你指的是哪一个,并且是不明确的。这就是所谓的'Alias',你也可以为表或字段名做它。 –