Ich werde beschreiben, was ich zu erreichen versuchen:T-SQL-Filterung auf dynamischen Namen-Wert-Paaren
Ich bin vorbei bis zu einer SP eine XML mit dem Namen Wert-Paaren, die ich in eine Tabelle Variable setzen, sagen wir mal @nameValuePairs
. Ich muss eine Liste von IDs für Ausdrücke (eine Tabelle) mit genau dieser Übereinstimmung der Name-Wert-Paare (Attribute, eine andere Tabelle) zugeordnet abrufen.
Das ist mein Schema:
Expressions Tabelle -> (expressionId, attributeId)
Tabelle Attribute -> (attributeId, attribute, attribute)
Nach dem Versuch, komplizierte Sachen mit dynamischem SQL und bösen Cursorn (was funktioniert, aber es ist schmerzhaft langsam), das ist, was ich jetzt habe:
--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
Können Leute bitte überprüfen und sehen, ob sie irgendwelche Probleme entdecken können? Gibt es einen besseren Weg, dies zu tun?
Jede Hilfe wird geschätzt!
Wie ich unten bemerkte, glaube ich nicht, dass diese Abfrage das Szenario behandeln würde, in dem ein Ausdruck mehr als die übereinstimmenden Attribute hatte. h. Ausdruck hat Attribut-IDs (1,2,3,4) und die erforderlichen Attribute waren (2,3) – CAbbott
In Ihrem Beispiel behandelt diese Abfrage das Szenario, in dem der Ausdruck mindestens "(2,3) hat. In meinem Szenario ist das akzeptabel, aber jetzt hast du mich zum Nachdenken gebracht. Wie würden Sie das Szenario bearbeiten, das eine exakte Übereinstimmung erfordert (erforderliches Attribut 1,2 und Ausdrücke mit 1,2, X werden nicht zurückgegeben)? – JohnIdol
Meine Abfrage sollte die exakte Übereinstimmung behandeln (E = {2,3} & A = {2,3}); Szenarien wie Überschreitungen (E = {2,3,4} & A = {2,3}) sowie Minderjährige (E = {3} & A = {2,3}) sind von der endgültigen Ergebnismenge ausgeschlossen. – CAbbott