我想提供一個真正的數據倉庫模式的簡單示例,所以請原諒我,如果表是如此天真和基本。在MS SQL Server中的所有選擇字段上分組的更好方法
主表被稱爲Items
與ItemName
作爲主鍵:
有兩種稱爲Properties
和attributes
所有其它表與id
柱(自動身份)作爲主鍵:
問題:我想查詢這些表是這樣的:
SELECT
I.ItemName, A.AttributeName, I.Col1, I.Col2, I.Col3, I.Col4,
pForFilter.Property
FROM
Items I
LEFT OUTER JOIN
attributes A ON I.ItemName = A.ItemName
LEFT OUTER JOIN
Properties pForFilter On I.ItemName = pForFilter.ItemName
GROUP BY
I.ItemName, A.AttributeName, I.Col1, I.Col2, I.Col3, I.Col4,
pForFilter.Property
HAVING
pForFilter.Property = 'Prop1'
下面是結果:
查詢的實部爲I.Itemname
,A.AttributeName
爲不同的值,因此添加GROUP BY
以模擬這兩個字段上的不同值。請注意,過濾是根據Property
列完成的,但我不需要選擇列表中的屬性。然而,我還需要選擇列表中的其他字段Items
表(Col1,Col2,Col3,Col4)。我的問題是我可以重寫這個查詢,這樣我就不必在所有這些額外的字段上分組了嗎?提供的查詢是否有效?如果我必須使用它,我可以使用索引來提高查詢的速度以及它可以是什麼索引?
內蒙古組合JOIN和GROUP BY必填字段的是我錯過了。我可以使用索引提高速度嗎?特殊項目表具有良好的記錄數量,屬性可以達到1000行(可以忽略),屬性表可以達到100萬行。 –
@YasserSobhdel,我沒有索引完美的知識。但我認爲在連接列上創建非聚集索引可能會提高性能。看到這篇文章建議索引http://www.sqlskills.com/blogs/kimberly/indexes-just-because-you-can-doesnt-mean-you-should/ – BICube