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

时间:2010-06-16 16:12:15

标签: sql-server database database-design sql-server-2008 views

所以我不一定说如果可能的话,这甚至是个好主意,因为视图的模式会非常不稳定,但有没有办法在单个视图中表示有多个关系?< / p>

例如,假设我的客户可以在数据库中拥有任意数量的地址。有没有办法列出每个地址的每一列,可能有一个数字作为别名的一部分(例如,像Customer Id,Name,Address_Street_1,Address_Street_2等列?)

谢谢!

3 个答案:

答案 0 :(得分:3)

是 - 使用:

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

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

答案 1 :(得分:3)

简单地说,不。每次你想要使用它时动态重新创建视图,就是这样。

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

答案 2 :(得分:3)

不是 - 你真的在做一个动态的支点。可以使用OPENROWSET来获取动态生成的查询,但是否这是可取的,如果不了解更多关于业务案例的话,很难说。

第一个make a stored proc which does the dynamic pivot就像我在StackExchange Data Explorer上做的那样。

基本上,您生成用于构建列列表的动态SQL。这只能在存储过程中完成。这适用于applciation调用。

但是,如果你想在很多不同的联接或即席查询中重复使用它呢?

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

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

已故的Ken Henderson在his excellent book中有一些很好的例子:“大师的SQL Server存储过程指南,XML和HTML”(你必须喜欢上面的“Covers .NET!”)封面很好地捕捉了2002年的时代精神!)。

他只涵盖了环回部分(使用视图和用户定义的函数),在2005年之前,不太详细的PIVOT语法不可用,但也可以使用CASE语句a characteristic function生成PIVOT。

显然,这种技术有一些警告(我甚至无法在我们的生产服务器上执行此操作)。