0

首先,对不起我的写作方式,这里的英语不好。

请考虑以下情况:

我使我的数据库架构结合了这样的视图:

  • 实体City具有列 { city_id, city_name, state_name, ...}
  • 实体User具有列 { user_id, user_name, user_login, city_id, ...}

每个实体都有一个视图,该city视图没有任何其他实体的 FK,所以它是一个简单的选择。

User实体对实体有一个 FK city,因此它与city视图中的实体进行连接。

如下例:

create view vw_user as
    select user.user_id,
           user.user_name,
           user.user_login,
           vw_city.*
    from user (nolock)
    inner join vw_city (nolock) on vw_city.city_id = user.city_id
go

因此,如果您有一个像 user_access 这样的实体,并且对用户有一个 FK,那么 的视图user_access将具有到 的内部连接vw_user,并且它将显示来自usercity实体的所有列。

最后,我只是对视图进行查询,它会返回包含所有外部引用的完整实体。

这很好用,并且使维护过程变得非常容易,如果需要对其中一个实体进行任何更改,我有一个存储过程可以重新编译所有视图。

但是,它有一个问题,我在一个非常糟糕的情况下发现了这个,使用这种架构的系统已经运行得非常快速和流畅,例如我需要加入两个共享实体城市的实体,所以它会生成一个列冲突,SQL Server 不允许在视图中这样做,您可以毫无问题地执行冲突查询,但不能在视图中执行此操作。

所以,这是我的问题,我需要找到解决这个问题的方法,但我自己找不到答案。

我最终做的唯一一件事就是制作一个硬编码的视图,并重命名了列。

但我想要一个针对整个架构的解决方案,是永久性的,比如升级。

代码中遵循此体系结构,使用 C#,因此依赖于列名。

当我从查询中读取数据时,我需要从列名中获取数据,因此此代码可以与其他类重用,在 c# 代码中执行与视图在查询中所做的相同的事情。

因此,用序数获取数据是不可能的。

有任何想法吗?

谢谢,对不起,但这很难描述。

4

2 回答 2

1

好吧,只是为了结束主题,正如 SMC 建议的那样,我使用别名来识别查询中的列和表。

所以查询现在看起来像这样 - 使用主题中的示例:

Select 1.user_id as 1,
       1.user_name as 2,
       1.user_login as 3,
       1.city_id as 4,
       2.city_id as 5,
       2.city_name as 6,
       2.state_name as 7
from user as 1
inner join city as 2 on 2.city_id = 1.city_id

请注意第 4 列和第 5 列,它们现在不会发生碰撞 :)

文我的应用程序进行此查询,他还使Classes相关人员知道他们在当前查询中的别名。

它工作正常,解决了我的问题,我不再需要使用视图。

最后,应用程序比以前更快。

就是这样:)希望它可以帮助任何人。

于 2012-10-29T18:15:41.017 回答
0

这是因为Column Name每个Viewor中的 都Function必须是唯一的。选择列名称时需要具体。使用别名,然后引用列名称。

您尝试在语句中多次使用单个列名创建 VIEW。

删除 * 并给出明确的列名

于 2012-08-20T21:01:23.657 回答