2012-02-10 3 views
2

У меня есть следующая проблема. У меня есть две таблицы в базе данных - table1 и table2.Проверка нескольких данных в одном запросе

Table1 
id| val1| val2 
-------------- 
1 | 234 | 342 
2 | 325 | 356 
... 

Table2 
id | uid | val 
-------------- 
1 | 5 | 234 
2 | 6 | 362 
3 | 5 | 123 

Я хотел бы проверить для каждой записи в table2, если вал существует в table1 (table2.val=table1.va1 or table2.val > table1.vall). В таблице 1 около 2 миллионов записей. В таблице 2 несколько тысяч. Если результат запроса true, я бы хотел удалить строки из таблицы2.

Возможно ли это сделать в одном запросе? mysql или postgresql

Производительность очень важна.

+2

В таблице 1 нет столбца под названием 'val' –

+0

"для каждой записи в таблице2, если val существует в таблице2", безусловно, один из них должен быть 'table1'! – onedaywhen

+0

Кроме того, нам нужна информация о том, как присоединиться к этим таблицам, например. делает 'uid' в' Table2' ссылкой 'id' в' Table1'? – onedaywhen

ответ

0

Предполагая, что (t2.val = t1.val1) or (t1.val2 > t2.val) условия:

delete table2 
from table2 t2 
inner join table1 t1 on (t2.val = t1.val1) or (t1.val2 > t2.val) 
+0

Время выполнения составляет 161 секунду. Возможно ли выполнить этот запрос быстрее? – Astaz3l

+0

ОК, я добавил индексы, и все работает отлично! Спасибо :) – Astaz3l

+0

@ Astaz3l точно :) –

0
delete t 
from #table2 t 
inner join #table1 t2 
on t.val = t2.val or t2.val>t.val 
0

Предполагая, что uid в Table2 ссылка id в Table1 (и что ни таблицы содержат нули), это возвращает строки в Table1, которые удовлетворяют критериям существования:

SELECT * 
    FROM Table1 
WHERE EXISTS (
       SELECT * 
       FROM Table2 
       WHERE Table2.uid = Table1.id 
         AND (
          Table2.val = Table1.val1 
          OR Table2.val > Table1.val2 
         ) 
      ); 
Смежные вопросы