Многократная проверка данных в одном запросе - PullRequest
2 голосов
/ 10 февраля 2012

У меня следующая проблема. У меня есть 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

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

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

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

Ответы [ 3 ]

0 голосов
/ 10 февраля 2012

Принимая (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 голосов
/ 10 февраля 2012

Если предположить 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
                          )
              );
0 голосов
/ 10 февраля 2012
delete t 
from #table2 t 
inner join #table1 t2 
on t.val = t2.val or t2.val>t.val
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...