1

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

4

3 回答 3

1

你不会得到视图- 你必须自己定义它们。

例如,如果您需要一个视图用于贝尔法斯特,第二个用于纽里,第三个用于拉恩 - 那么您需要创建三个视图,只返回与相关城市名称匹配的行

 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,因此永远不会看到基础表中的任何其他数据行。

但是视图是数据库对象,如表或存储过程;您需要创建它们,维护它们,不再需要它们时扔掉它们。

于 2012-10-12T12:27:30.677 回答
1

编辑

根据您更新的问题,您只需为要过滤的每个城镇创建一个视图:

CREATE VIEW BelfastView AS

SELECT    ID,
          Town,
          Person
FROM      YourTable
WHERE     Town = 'BELFAST'

尽管您只向我们提供了一小部分数据样本,但您所要求的几乎从来都不是一个好主意。当你的数据库中有 50 个新城镇时会发生什么?您要为每个城镇创建一个视图吗?这不能很好地扩展(或根本没有)。

于 2012-10-12T12:21:31.793 回答
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
于 2012-10-12T12:39:07.913 回答