Подтвердить что ты не робот

В чем разница при сравнении с круглыми скобками: WHERE (a, b) = (1,2)

Я наткнулся на следующий (действительный) запрос в MySQL (также работает в Oracle/MSSQL при замене = на IN):

SELECT * from mytable WHERE (a, b)=(1,2)

Это то же самое, что и

SELECT * from mytable WHERE a=1 and b=2

Я думаю, что определение в docs здесь:

simple_expr:
  [...]
  | (expr [, expr] ...)
  [...]

Что это называется? Есть ли какие-либо плюсы и минусы для его использования?

4b9b3361

Ответ 1

Это может быть очень удобно при необходимости сравнивать несколько столбцов с несколькими комбинациями значений с помощью IN():

 SELECT * FROM YourTable
 WHERE (col1,col2) IN((1,2),(2,3),(4,4)...)

Вместо:

SELECT * FROM YourTable
WHERE (col1 = 1 and col2 = 2) OR
      (col1 = 2 and col2 = 3) OR
      (col1 = 4 and col2 = 4) OR
      ....

После рассмотрения плана выполнения обоих запросов я могу сказать, что в Oracle (используя IN(), который в основном такой же) оптимизатор оценивает одинаково, и оба используют индексы:

Отдельные условия:

EXPLAIN PLAN FOR
SELECT * FROM dim_remedy_tickets_cache t
where t.tt_id = '1' and t.region_name = 'one';

6   |   0 | SELECT STATEMENT            |                              |     1 |   311 |    30   (0)| 00:00:01 |
7   |   1 |  TABLE ACCESS BY INDEX ROWID| DIM_REMEDY_TICKETS_CACHE     |     1 |   311 |    30   (0)| 00:00:01 |
8   |   2 |   INDEX RANGE SCAN          | DIM_REMEDY_TICKETS_HISTORYPK |     1 |       |    20   (0)| 00:00:01 |

Комбинированные условия:

EXPLAIN PLAN FOR
SELECT * FROM dim_remedy_tickets_cache t
where (t.tt_id,t.region_name) in  (('1','one'))

6   |   0 | SELECT STATEMENT            |                              |     1 |   311 |    30   (0)| 00:00:01 |
7   |   1 |  TABLE ACCESS BY INDEX ROWID| DIM_REMEDY_TICKETS_CACHE     |     1 |   311 |    30   (0)| 00:00:01 |
8   |   2 |   INDEX RANGE SCAN          | DIM_REMEDY_TICKETS_HISTORYPK |     1 |       |    20   (0)| 00:00:01 |

Я предполагаю, что все РСУБД будут оценивать эти запросы одинаковыми.

Конструкторы строк являются законными в других контекстах. Например, следующие два оператора семантически эквивалентны (и обрабатываются оптимизатором таким же образом):

Итак:

Минусы - Может быть, менее читабельны для некоторых людей, но в основном нет недостатков.

Плюсы - Меньший код и комбинация сравнения нескольких столбцов с помощью IN():

Ответ 2

Я не думаю, что есть разница между этими двумя запросами, оптимизатор, вероятно, сделает то же самое.

Вы должны запустить план выполнения для обоих запросов и посмотреть для себя.

Кроме этого, это скорее предпочтение. Для обеих сторон не так много недостатков и плюсов, поэтому выберите тот, который вам больше нравится.