一个表中的SQL视图

时间:2012-10-12 12:17:11

标签: sql-server filter views

我的同事问了一个关于从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为它找到的每个城镇创建视图,然后返回每个城镇的记录。

3 个答案:

答案 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