我有三张桌子
documents
attributes
attributevalues
文档可以有很多属性 并且这些属性在attributevalue表中具有值
我想在单个查询中获取所有文档并在每行中分配相关文档的属性 (我假设每个文件都分配了相同的属性,现在不需要复杂的不同属性)
例如
docid attvalue1 attvalue2
1 2 2
2 2 2
3 1 1
我如何在单个查询中执行此操作
答案 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