2013-05-23 17 views
5

Mamy następujące tabele w naszym systemieZapytanie o dopasowanie wielu wierszy?

Tabela obiekt

object_id object_description 
    1    "Car" 
    2    "Person" 

Tabela atrybut

attribute_id attribute_name 
    1    "hair_color" 
    2    "height" 
    3    "number_of_doors" 
    4    "engine_size" 

Tabela ATTRIBUTE_VALUE

attribute_id attribute_value_id value 
    1    1    "black" 
    1    2    "blonde" 
    2    1    "more than 1 meter" 
    2    2    "less than 1 meter" 
    3    1    "5 doors" 
    3    2    "3 doors" 
    4    1    "more than 1.9" 
    4    2    "less than 1.9" 

Tabela object_attribute

object_id attribute_id attribute_value_id 
    1   3    1 -- Car, number of doors,5 
    1   3    2 -- Car, number of doors,2 
    1   4    1 -- Car, engine size, greater than 1.9 
    1   4    2 -- Car, engine size, less than 1.9 

Dzięki tej strukturze jesteśmy o wiele problemy z obiektów, które pasują do wielu charakterystyczne (tj uzyskać wszystkie samochody z 3 drzwiami i pojemności silnika większej niż 1.9) Obecnie używamy przecina dla tej

SELECT OBJECT_ID 
    FROM object_attribute 
WHERE attribute_id  = 3 
    AND attribute_value  = 2 
INTERSECT 
SELECT OBJECT_ID 
    FROM object_attribute 
WHERE attribute_id  = 4 
    AND attribute_value  = 1 

Istnieje zmierzających obiekty z numerem ró? nych atrybutów, więc nie możemy użyć stałego Liczba złączeń lub INTERSECTs już jest

Czy istnieje sposób generowania wielu kombinacji wszystkich atrybutów w "dynamiczny sposób"?

Co chcielibyśmy osiągnąć to dynamiczny zapytań, które buduje się widok takiego:

object_id | att_name_1 | att_value_1 | att_name_2 | att_value2 | att_name_n | attr_value_n

Ponieważ liczba atrybutów jest zmienna powinniśmy trigered i aktualizacja zapytania, gdy nowy obiekt jest wstawiony

Guys myślę, co mam na myśli nie jest to możliwe, więc prawdopodobnie będziemy iść z ta dynamiczna konstrukcja zapytania w środowisku wykonawczym. Dziękuję wszystkim za odpowiedzi

+0

Czy możesz przekroczyć obiekt łączenia na atrybut i lewe dołączenie do wyników? A może potrzebujesz tylko atrybutów, które możesz wystartować z Object_Attribute i dołączyć do obu kolumn? – Liath

+3

Czy RDBM's? Retag dla lepszej widoczności – Yaroslav

+2

Musisz budować kwerendę dynamicznie, z odpowiednią ilością połączeń JOIN na nich. – Borik

Odpowiedz

1

po kilku testach wymyśliłem następujące zapytanie:

select distinct 
a.attribute_name, o.object_description, av.value, 
oa.attribute_id, oa.object_id, oa.attribute_value_id 
from object_attribute oa 
inner join attribute a on (oa.attribute_id = a.attribute_id and a.attribute_id = 3) 
inner join object o on (oa.object_id = o.object_id and o.object_id = 1) 
inner join attribute_value av on (oa.attribute_value_id = av.attribute_value_id and av.attribute_value_id = 2) 
where 
(av.attribute_id = 3 and o.object_id = 1 and av.attribute_value_id = 2) 

union 
select distinct 
a.attribute_name, o.object_description, av.value, 
oa.attribute_id, oa.object_id, oa.attribute_value_id 
from object_attribute oa 
inner join attribute a on (oa.attribute_id = a.attribute_id and a.attribute_id = 4) 
inner join object o on (oa.object_id = o.object_id and o.object_id = 1) 
inner join attribute_value av on (oa.attribute_value_id = av.attribute_value_id and  av.attribute_value_id = 1) 
where 
(av.attribute_id = 4 and o.object_id = 1 and av.attribute_value_id = 1) 

co prowadzi do następujących: query results

Jeśli używasz MS SQL Server chciałbym umieścić to w procedurze przechowywanej, która akceptuje trzy identyfikatory jako parametry.

+0

Twoje zapytanie jest dobre, ale nie zapewnić sposób dynamicznego pozyskiwania tych pól. Mam na myśli, robisz joind ze znanymi wartościami, ale chciałbym zbudować tę kwerendę za pomocą pewnego rodzaju permutacji lub kombinacji dynamicznie. – Aitor

+0

Jeśli używasz MS SQL Server, możesz dynamicznie zbudować zapytanie i użyć sp_executesql do jego uruchomienia. http://msdn.microsoft.com/en-us/library/ms188001.aspx –