又一个tsql问题

时间:2010-10-10 12:33:24

标签: sql-server tsql

我有三张桌子

documents
attributes 
attributevalues

文档可以有很多属性 并且这些属性在attributevalue表中具有值

我想在单个查询中获取所有文档并在每行中分配相关文档的属性 (我假设每个文件都分配了相同的属性,现在不需要复杂的不同属性)

例如

docid  attvalue1  attvalue2

1         2         2

2         2         2

3         1         1

我如何在单个查询中执行此操作

3 个答案:

答案 0 :(得分:2)

如果没有动态SQL,我不认为你能做到这一点。

实体 - 属性 - 值(EAV)技术(您正在使用的技术)的关键是将列存储为行。您要做的是将这些行转换回列以用于此查询。使用PIVOT使这成为可能。但是,PIVOT需要知道在编写查询时需要转换为列的行数。因此,假设您使用EAV是因为您需要灵活的属性/值,那么在编写查询时您将不会知道此信息。

因此,解决方案是将动态SQL与PIVOT结合使用。做了一个快速搜索,看起来很有希望(并没有真正阅读整个事情):

http://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspx

为了记录,我不是动态SQL的粉丝,并建议找到解决更大问题的另一种方法(例如在应用程序代码中转动)。

答案 1 :(得分:0)

如果您在设计时知道所有属性(及其ID):

SELECT d.docid,
       a1.attvalue AS attvalue1
       a2.attvalue AS attvalue2
  FROM documents d
  JOIN attributevalues a1 ON d.docid = a1.docid
  JOIN attributevalues a2 ON d.docid = a2.docid
 WHERE a1.attrid = 1
   AND a2.attrid = 2

如果不这样做,事情会变得更加混乱,如果不了解您的架构,就很难回答。

答案 2 :(得分:-1)

举个例子

记录表的列

docid,docname,createddate,createduser

和值

1 account.doc 10.10.2010 aeon
2 hr.doc 10.11.2010 aeon

属性表的列

attid,name,type

和值

1 subject string
2 recursive int

attributevalues表的列

attvalueid,docid,attid,attvalue(sql_variant)

和值

1 1 1 "accounting doc"
1 1 2 0
1 2 1 "humen r doc"
1 2 2 1

我想要查询结果

docid,name,atribvalue1,atribvalue1,atribvalueN 
1 account.doc "accounting doc" 0
2 hr.doc "humen r doc" 1