我將描述什麼,我想實現:T-SQL過濾
我傳遞到一個SP的XML與我放到一個表變量名稱值對,比方說@nameValuePairs
。 我需要檢索表達式(表)的ID列表與名稱 - 值對(屬性,另一個表)的完全匹配關聯。
這是我的架構:
表達式表 - >(expressionId,屬性Id)
屬性表 - >(屬性Id,的attributeName,的AttributeValue)
嘗試後複雜的東西與動態SQL和邪惡的遊標(這工作,但它是痛苦的緩慢)這是我現在得到的:
--do the magic plz!
-- retrieve number of name-value pairs
SET @noOfAttributes = select count(*) from @nameValuePairs
select distinct
e.expressionId, a.attributeName, a.attributeValue
into
#temp
from
expressions e
join
attributes a
on
e.attributeId = a.attributeId
join --> this join does the filtering
@nameValuePairs nvp
on
a.attributeName = nvp.name and a.attributeValue = nvp.value
group by
e.expressionId, a.attributeName, a.attributeValue
-- now select the IDs I need
-- since I did a select distinct above if the number of matches
-- for a given ID is the same as noOfAttributes then BINGO!
select distinct
expressionId
from
#temp
group by expressionId
having count(*) = @noOfAttributes
請人們可以檢查一下,看看他們是否能夠發現任何問題?有沒有更好的方法來做到這一點?
任何幫助表示讚賞!
正如我在下面指出的,我不相信這個查詢將處理表達式超過匹配屬性的場景。即表達式具有屬性ID(1,2,3,4),所需屬性爲(2,3) – CAbbott 2009-05-29 15:01:04
在您的示例中,此查詢處理表達式具有'至少'(2,3)的情形。在我的情況下,這是可以接受的,但現在你讓我思考。你將如何處理需要精確匹配的場景(必需屬性1,2和表達式1,2,X不返回)? – JohnIdol 2009-05-29 17:15:00
我的查詢應該處理精確匹配(E = {2,3}&A = {2,3});例如過量(E = {2,3,4}&A = {2,3})以及低估(E = {3}&A = {2,3})等情景從最終結果集中排除。 – CAbbott 2009-05-29 17:38:57