2013-05-23 33 views
5

Chúng tôi có bảng tiếp theo trong hệ thống của chúng tôiTruy vấn để đối sánh nhiều hàng?

Bảng đối tượng

object_id object_description 
    1    "Car" 
    2    "Person" 

Bảng thuộc tính

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

Bảng 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" 

Bảng 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 

Với cấu trúc này chúng tôi đang có rất nhiều vấn đề nhận được đối tượng phù hợp với nhiều tiêu chí (ví dụ: nhận được tất cả những chiếc xe với 3 cửa ra vào và kích thước động cơ lớn hơn 1.9) Hiện nay chúng tôi đang sử dụng cắt để làm điều này

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 

Có đối tượng khác nhau với số lượng khác nhau của các thuộc tính, vì vậy chúng tôi không thể sử dụng một số cố định của JOIN hoặc INTERSECTs nữa

Có cách nào tạo nhiều kết hợp của tất cả các thuộc tính trong một "cách động" không?

Những gì chúng ta muốn đạt được là một truy vấn năng động mà xây dựng một cái nhìn như thế này:

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

Khi số lượng các thuộc tính có thể thay đổi chúng ta nên trigered và cập nhật của các truy vấn khi một đối tượng mới được chèn

Guys Tôi nghĩ rằng những gì tôi có trong tâm trí là không thể, vì vậy chúng tôi có thể sẽ đi với cấu trúc truy vấn động này khi chạy. Cảm ơn tất cả các bạn cho câu trả lời của bạn

+0

Bạn có thể vượt qua đối tượng tham gia vào thuộc tính và tham gia trái vào kết quả của bạn không? Hoặc nếu bạn chỉ muốn các thuộc tính tồn tại, bạn có thể bắt đầu từ Object_Attribute và tham gia vào cả hai cột khác? – Liath

+3

RDBM nào? Retag cho khả năng hiển thị tốt hơn – Yaroslav

+2

Bạn cần phải xây dựng một truy vấn động, với số tiền phải của JOIN trên chúng. – Borik

Trả lời

1

sau khi một số xét nghiệm tôi đã đưa ra các truy vấn sau đây:

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) 

mà kết quả trong những điều sau đây: query results

Nếu bạn đang sử dụng MS SQL Server tôi sẽ đặt nó trong một thủ tục lưu trữ chấp nhận ba Id là tham số.

+0

truy vấn của bạn là tốt nhưng nó không cung cấp một cách để có được những lĩnh vực động. Tôi có nghĩa là, bạn đang làm một joind với các giá trị được biết đến nhưng tôi muốn xây dựng truy vấn đó bằng cách sử dụng một số loại hoán vị hoặc kết hợp động. – Aitor

+0

cũng nếu bạn đang sử dụng MS SQL Server bạn có thể xây dựng truy vấn động và sử dụng sp_executesql để chạy nó. http://msdn.microsoft.com/en-us/library/ms188001.aspx –

Các vấn đề liên quan