2011-01-05 23 views
1

我有一个更复杂的场景,但我认为它应该是可能的。在SQL中,我可以返回具有不同列数的表格

我有一个大的SPROC,其结果是一组人的一组特征。

所以表会是这个样子:

 
Property |	 Client1 	 Client 2	 Client3 
----------------------------------------------------------- 
Sex  |	 M  	 F  	 M 
Age  |	 67  	 56  	 67 
Income |	 Low  	 Mid 	 Low 

它使用了游标,遍历不同的数据集构建的。

我现在面临的问题是,有不同数量的客户端和属性的,所以在不同的输入设置一个同样有效的结果可能是:

 
Property |	 Client1 	 Client 2 
------------------------------------------- 
Sex  |	 M  	 F 
Age  |	 67  	 56 
Weight |	 122  	 122 

不同数量的属性是很容易,这些都是只是额外的行。

我的问题是,我需要声明一个不同数量的列的临时表。

可能有2个客户或100个。每个客户保证每个物业最终上市。

什么SQL结构可以统计这个,我该如何声明它并在其中插入东西?

我不能只是将列和行翻转,因为每个列都有可变数目。

+1

您对行和列的排序似乎是从似乎合乎逻辑和平常的方式转换而来。一旦转换,这只是一个选择恰好返回不同数量的列的情况,这种情况发生......每次使用select时。存储过程是否是问题? – Phrogz 2011-01-05 03:13:01

回答

4

首先,你要考虑你的规范化设计,像这样:

Create Table ClientAttributes 
(
    ClientId .... 
    , Sex Char(1)... 
    , Age int... 
    , Income... 
) 

其次,在一般的SQL语言不减速用于动态列生成。为了达到这个目的,你必须在运行时(也称为动态SQL)将SQL语句作为一个字符串来构建。最好在中间层或报告引擎而不是T-SQL中执行此操作。第三,一个无限灵活的设计,你不知道属性或实例的数量或类型,根本不是设计。每个表格代表具有已知属性的实体的集合。他们不是任意数据。在设计时需要知道属性(列),否则你就冒着一种只有混沌缰绳才能完成的克苏鲁设计的风险。

休斯的建议是使用实体属性值设计(也称为EAV)。需要一个巨大的纪律来正确地做一个EAV。它只在被视为一团数据时才有效。也就是说,没有开发人员能够过滤任何特定的属性(即硬编码查询特定属性名称的查询),曾经计算过这些值,并且永远无法确保特定值之间的一致性。如果你能保持这种纪律,那么任意一组数据作为一个有限的部分可以工作。然而,一旦你决定硬编码查询寻找一个特定的属性,你已经走下了黑暗的道路,并永远支配你的命运。随着数据库的增长,性能将显着下降。您将没有数据完整性(例如,您有两个名为“Age”和“Client Age”的属性,其中一些值为整数,其他为文本)。 EAV可能是一个噩梦来维护。维护,报告,查询等都有一个标准化的设计。

4

这看起来像你在服务器*上使用Pivoting。

虽然你可以做到这一点,但处理起来会非常尴尬 - 而且我不知道任何可以为你工作的ORM(如果沿着这条路走下去的话)。

相反的枢转,如何安排它更像(* 2):

Client | Property | Value 
------------------------------ 
Client 1| Sex  | M 
Client 1| Age  | 67 

这样你仍然可以做到这一点每个客户端的摆动在应用程序中进行显示。

(* FWIW:你知道2005+具有PIVOT Commands,对SQL Server要您使用游标保存?)

(* 2这只是一个可能方法这是哈克,和托马斯的建议。 。您的规范化模式是一个更好的和(可能)更有效的选择)

+0

Ew ... EAV。您可能还会提到或链接到EAV的一些陷阱。 – Thomas 2011-01-05 03:50:38

+0

看起来你已经做了很好的解释为什么它是一个坏主意:) – 2011-01-05 06:04:47

相关问题