我的同事问了一个关于从SQL Server数据库获取数据的问题。
我有一个示例数据集
[ID],[TOWN],[PERSON]
[1],[BELFAST],[JAMES]
[2],[NEWRY],[JOHN]
[3],[BELFAST],[SIMON]
[4],[LARNE],[ALAN]
现在我要返回一个SQL数据集,它根据视图返回一个不同的表。
基本上在代码中,我可以在城镇中获得一个独特的,然后在城镇上循环sql过滤。但有没有办法在SQL中做到这一点?
我会得到(3)观点回来(2贝尔法斯特,1纽里和1拉恩)
基本上我会返回
[ID],[Town],[Person]
[1],[Belfast],[James]
[3],[Belfast],[Simon]
然后另一个视图将返回'Larne'和Newry的最后一个视图。基本上SQL为它找到的每个城镇创建视图,然后返回每个城镇的记录。
答案 0 :(得分:1)
修改强>
根据您更新的问题,您只需为要过滤的每个城镇创建一个视图:
CREATE VIEW BelfastView AS
SELECT ID,
Town,
Person
FROM YourTable
WHERE Town = 'BELFAST'
虽然您只向我们提供了一小部分数据样本,但您提出的问题几乎绝不是一个好主意。当您的数据库中有50个新城镇时会发生什么?你打算为每个城镇创建一个视图吗?这不能很好地扩展(或根本没有)。
答案 1 :(得分:1)
你没有获取视图 - 你必须自己定义它们。
E.g。如果您需要贝尔法斯特的一个视图,纽里的第二个视图和拉恩的第三个视图 - 那么您需要创建三个视图,这些视图仅返回与相关城市名称匹配的行
CREATE VIEW BelfastView
AS
SELECT ID, Town, Person
FROM dbo.Towns
WHERE Town = 'Belfast'
CREATE VIEW LarneView
AS
SELECT ID, Town, Person
FROM dbo.Towns
WHERE Town = 'Larne'
CREATE VIEW NewryView
AS
SELECT ID, Town, Person
FROM dbo.Towns
WHERE Town = 'Newry'
现在,可能只允许某些用户从BelfastView
中选择数据,因此永远不会从基础表中看到任何其他数据行。
但是视图是数据库对象,如表或存储过程;你需要创建它们,维护它们,在不再需要时抛弃它们。
答案 2 :(得分:0)
基本上我已决定将其作为存储过程运行,以将每个项目作为列表返回给我。所以有类似的东西:
Create Procedure ListTowns
As
declare @towns char(11)
select @towns = (select distinct Town from [Towns])
while @towns is not null <> 0
begin
select * from [YourTable] where Town = @towns
end