Sql server 是否可以编写包含一对多关系的数据库视图?

Sql server 是否可以编写包含一对多关系的数据库视图?,sql-server,database,database-design,sql-server-2008,views,Sql Server,Database,Database Design,Sql Server 2008,Views,因此,如果可能的话,我不一定说这是个好主意,因为视图的模式会非常不稳定,但是有没有办法在单个视图中表示一个具有多个关系的视图 例如,假设我有一个客户在数据库中可以有任意数量的地址。是否有任何方法可以列出每个地址的每一列,其中可能有一个数字作为别名的一部分(例如,客户Id、姓名、地址\街道\ 1、地址\街道\ 2等列) 谢谢 是-使用: CREATE VIEW customer_addresses AS SELECT t.customer_id, t.customer

因此,如果可能的话,我不一定说这是个好主意,因为视图的模式会非常不稳定,但是有没有办法在单个视图中表示一个具有多个关系的视图

例如,假设我有一个客户在数据库中可以有任意数量的地址。是否有任何方法可以列出每个地址的每一列,其中可能有一个数字作为别名的一部分(例如,客户Id、姓名、地址\街道\ 1、地址\街道\ 2等列)

谢谢

是-使用:

CREATE VIEW customer_addresses AS
    SELECT t.customer_id,
           t.customer_name,
           a1.street AS address_street_1,
           a2.street AS address_street_2
      FROM CUSTOMER t
 LEFT JOIN ADDRESS a1 ON a1.customer_id = t.customer_id
 LEFT JOIN ADDRESS a2 ON a2.customer_id = t.customer_id

如果你提供了更多的信息,那么就更容易给你一个更好的答案。您可能正在查看数据透视(将行转换为列)。

简单地说,不。至少在每次需要使用视图时,都要动态地重新创建视图


但是,您可以做的是预定义视图中的4个地址列,然后将一对多关系的前四个结果填充到这些列中。它不是您想要的动态视图,但在我看来,它也更稳定/可用。

不太好-您确实在做动态透视。可以使用OPENROWSET访问动态生成的查询,但是如果不了解更多关于业务案例的信息,很难说这是否可取

首先,就像我在StackExchange数据资源管理器上所做的那样

基本上,您可以生成动态SQL来构建列列表。这实际上只能在存储过程中完成。这对于应用程序调用很好

但是,如果您想在许多不同的联接或特殊查询中重复使用它,该怎么办

然后,看一看:“使用SQL Server OPENROWSET打破规则”

现在,您可以通过循环回服务器,然后将结果放入行集中来调用存储的进程-这可以在视图中

已故的肯·亨德森(Ken Henderson)在《SQL Server存储过程、XML和HTML专家指南》(The Guru’s Guide to SQL Server Storage Procedures,XML和HTML)中有一些很好的例子(你一定会喜欢封面上的小“Covers.NET!”,它很好地捕捉了2002年的时代精神!)

他只介绍了环回部分(使用视图和用户定义函数),不太详细的PIVOT语法直到2005年才可用,但PIVOT也可以使用CASE语句生成


显然,这种技术有一些警告(我甚至不能在我们的生产服务器上这样做)。

您基本上是在“非规范化”结构,这对于报告工具来说非常有用。很抱歉,混淆了-我指的是当有两个表时,Customer和Address,地址中有客户ID。这个视图不意味着客户的地址在两个不同的表(a1和a2)中吗?@Brandon Linton:a1和a2是表别名,在本例中是同一个表。+1@OMG Ponies很好,很抱歉我错过了这一点。因此,如果我知道每个客户有多少个地址,这就行了。我要说的是,我指的是一个场景,其中有一个客户表和一个地址表,地址表有一个客户ID引用(外键关系)谢谢……你有什么例子可以说明在这种情况下你所说的动态轴心点/开放行集吗?@Brandon Linton扩展了我的回答谢谢Cade……我想这与我想知道的最接近。