我有一个表 propertyvalues如下所示:* ^( ] I, s4 g7 N5 F1 k
ID FileID属性值 1 x名称1.pdf 2 x大小12567 3 x类型application / pdf 4 y名称2.pdf 5是size 23576 6y 类型application / pdf......等等如何在上表上写字?SQL查询以获得以下结果 K( M% l6 P4 f0 g5 eFileID 名称大小类型x 1.pdf 12567 application / pdf y 2.pdf pdf : L0 h' `2 H2 } 解决方案: $ Z% J Z# ]/ b
无论缺少多少行,连接版都能正常运行: . A: z$ c2 v4 |) tSELECT pd.FileID ,p1.Value AS Name ,p2.Value AS Size ,p3.Value AS TypeFROM SELECT DISTINCT FileID FROM propertyvalues AS pd LEFT JOIN propertyvalues AS p ON p1.FileID = pd.FileID AND p1.Property = 'Name' LEFT JOIN propertyvalues AS p2 ON p2.FileID = pd.FileID AND p2.Property = 'Size' LEFT JOIN propertyvalues AS p3 3 ON p3.FileID = pd.FileID AND p3.Property = 'Type' ;假如你有一个表,其中FileID主键在哪里,就可以了DISTINCT用表替换子查询。% `( U) n' f6 U$ S2 {' M, ^: k
效率取决于许多因素。! r2 |2 E. f k( H/ I 所有FileID是否所有的线都有名称、大小和类型,并且没有其他属性(表的聚集索引位于(FileID,Property))?然后,该MAX(CASE...)版本将运行良好,因为无论如何都必须扫描整个表。/ u- c! w- ?5 }/ t; H
是否有三个以上的属性(超过)和许多属性FileID没有名字,大小和类型,所以应该JOIN这个版本可以很好地使用索引,(Property,FileID) INCLUDE (Value)仅此索引数据将用于连接。1 @0 q) @, D8 C" ]6 r
不确定PIVOT版本效率如何? , t7 q! \, A8 }8 e但是,在选择使用哪个版本之前,我建议您在您的环境(版本、磁盘、内存、设置等)中使用数据和表尺寸来测试各种版本。