2014-11-12 4 views
1
существует

У меня есть таблица:Оптимизация SQL-запроса с

+----+---------+-----------+--------------+-----------+ 
| id | item_id | attr_name | string_value | int_value | 
+----+---------+-----------+--------------+-----------+ 
| 1 |  1 |   1 | prop_str_1 | NULL  | 
| 2 |  1 |   2 | prop_str_2 | NULL  | 
| 3 |  1 |   3 | NULL   | 2   | 
| 4 |  2 |   1 | prop_str_1 | NULL  | 
| 5 |  2 |   2 | prop_str_3 | NULL  | 
| 6 |  2 |   3 | NULL   | 2   | 
| 7 |  3 |   1 | prop_str_4 | NULL  | 
| 8 |  3 |   2 | prop_str_2 | NULL  | 
| 9 |  3 |   3 | NULL   | 1   | 
+----+---------+-----------+--------------+-----------+ 

И я хочу, чтобы выбрать ITEM_ID с конкретными значениями атрибутов. Но это осложняется тем фактом, что выборка должна выполняться по нескольким атрибутам. Я должен сделать это только с помощью существует:

select * 
    from item_attribute as attr 
    where (name = 1 and string_value = 'prop_str_1') 
    and exists 
    (select item_id 
    from item_attribute 
    where item_id = attr.item_id and name = 2 and string_value = 'prop_str_2') 

Но число атрибутов может быть увеличена, и, следовательно, вложенные запросы с существует увеличится. Как я могу переписать этот запрос, чтобы уменьшить вложенные запросы?

UPD:

create table item_attribute(
    id int not null, 
    item_id int not null, 
    attr_name int not null, 
    string_value varchar(50), 
    int_value int, 
    primary key (id) 
); 

insert into item_attribute values (1, 1, 1, 'prop_str_1', NULL); 
insert into item_attribute values (2, 1, 2, 'prop_str_2', NULL); 
insert into item_attribute values (3, 1, 3, NULL, 2); 
insert into item_attribute values (4, 2, 1, 'prop_str_1', NULL); 
insert into item_attribute values (5, 2, 2, 'prop_str_3', NULL); 
insert into item_attribute values (6, 2, 3, NULL, 2); 
insert into item_attribute values (7, 3, 1, 'prop_str_4', NULL); 
insert into item_attribute values (8, 3, 2, 'prop_str_2', NULL); 
insert into item_attribute values (9, 3, 3, NULL, 1); 
+1

Почему два запроса используют разные имена таблиц? есть 2 таблицы или один? было бы лучше добавить ожидаемый результат, чтобы мы могли лучше вас поправить. – TheProvost

+0

@ TheProvost О, это ошибка! Это та же таблица. Я починил это. –

+0

Запрос, который вы написали, не вернет ничего, поскольку вы выбрали два разных имени attr_name с разными значениями string_value вместо attr_name. Я думаю, вам нужно использовать attr_id для возврата некоторого результата, всегда оба условия будут терпеть неудачу, как описано в вашем запросе –

ответ

1

Смотрите, если это работает для вас. Это по сути делает то же самое ... Ваш первый определитель состоит в том, что данный атрибут name = 1 и string = 'prop_str_1', но затем самосоединяется, чтобы снова привязать таблицу к тому же идентификатору, но второй атрибут и строку

select 
     attr.* 
    from 
     item_attribute attr 
     JOIN item_attribute attr2 
      ON attr.item_id = attr2.item_id 
      and attr2.name = 2 
      and attr2.string_value = 'prop_str_2' 
    where 
      attr.name = 1 
     and string_value = 'prop_str_1' 

У меня также был бы указатель на вашей таблице (имя, string_value, item_id), чтобы повысить производительность условий и условий соединения.

+0

Да, это послужит! И этот запрос хорошо распространяется на новые условия. Благодаря! –

Смежные вопросы