2013-07-01 4 views
2

Рассмотрим следующий TABLE_A и TABLE_B:Performance требуется запроса на выборку

Table_A 
ID |A_Field_1 
1 |10 
2 |11 
3 |12 

TABLE_B:

ID |B_Field_1 
1 |500 
1 |510 
1 |520 
2 |550 
3 |530 

Мне нужно написать запрос, где для извлечения ID и A_Field_1 для значений в Table_B, что не имеют B_Field_1 значений 520 или 530.

ВЫХОД:

ID |A_FIELD_1 
2 |11 

Мой текущий запрос выглядит следующим образом:

SELECT ID,A_Field_1 
from Table_A 
where ID not in (select ID from Table_B where B_Field_1 in (520,530)) 

Это работает, но может кто-то обеспечить запрос, основанный более высокую производительность; как и в приведенном выше запросе, внутренний запрос select ID from Table_B where B_Field_1 in (520,530) является большим и соответствует растущей таблице.

+1

который RDBMS ???? –

+0

@AmitSingh Это там в тегах: '[tag: informix]' –

+0

Какие индексы есть в этих двух таблицах? –

ответ

2

Попробуйте один -

SELECT 
     Id 
    , A_Field_1 
FROM Table_A a 
WHERE EXISTS(
      SELECT 1 
      FROM Table_B b 
      WHERE B_Field_1 NOT IN (520, 530) 
       AND b.Id = a.Id 
    ) 


SELECT 
     Id 
    , A_Field_1 
FROM Table_A a 
WHERE NOT EXISTS(
      SELECT 1 
      FROM Table_B b 
      WHERE B_Field_1 IN (520, 530) 
       AND b.Id = a.Id 
    ) 
+1

Да, это правильно, я не правильно прочитал вопрос. Удалит мой ответ, чтобы не вызвать путаницу. Индекс на TABLE_B в обоих столбцах также будет поддерживать производительность подзапроса. –

+0

+1 для хорошего и быстрого ответа –

+0

@Devart: Это не эквивалентно, хотя и запросу OP. Например, он вернет 'id = 1'. «НЕ СУЩЕСТВУЕТ». –

2

Вы можете попробовать, как этот также

SELECT 
     Id 
    , A_Field_1 
FROM TABLE_A A 
INNER JOIN 
(
    SELECT 
      Id 
     , COUNT(CASE WHEN B_Field_1 IN (520, 530) THEN 1 END) AS ValidId 
    FROM Table_B 
    GROUP BY Id 
) b ON A.Id = b.Id AND b.ValidId < 1 
+0

@Devart спасибо за ваше редактирование, чтобы мой ответ выглядел хорошо ... @ Devart Можете ли вы научить меня, как анализировать запрос, как numberofscan и количество операций, и как mcuh время требуется –

+1

Чтобы ваши запросы выглядели более чистыми, я предлагаю для использования нашей бесплатной он-лайн службы форматирования SQL - [Формат SQL] (http://www.sql-format.com/). В отношении оптимизации и анализа запросов существует много книг. Я рекомендую вам познакомиться с книгами [Itzik Ben-Gan] (http://tsql.solidq.com/) – Devart

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