В моем текущем приложении мне нужно выполнить этот тип запроса:
SELECT MIN((colA, colB, colC))
FROM mytable
WHERE (colA, colB, colC) BETWEEN (200, 'B', 'C') AND (1000, 'E', 'F')
и получить ответ (333, 'B', 'B')
, учитывая эти данные:
+------+------+------+
| colA | colB | colC |
+------+------+------+
| 99 | A | A |
| 200 | A | Z |
| 200 | B | B |
| 333 | B | B |
| 333 | C | D |
| 333 | C | E |
| 333 | D | C |
| 1000 | E | G |
| 1000 | F | A |
+------+------+------+
Каков наиболее эффективный способ выполнить это в реальном SQL? Пожалуйста, имейте в виду, что это пример игрушки, и что мое фактическое приложение имеет таблицы с различными столбцами и типами данных и сотни миллионов строк. Я использую MySQL, если это помогает. Вы также можете предположить, что на этих столбцах есть индекс PRIMARY или UNIQUE.
Если решение легко расширяется до более/менее столбцов, это еще лучше.
Сравнение кортежей:
Несколько человек спросили, поэтому я должен поставить это в вопросе. Кортежи упорядочены лексикографически, что означает, что последовательности упорядочены так же, как и их первые отличающиеся элементы. Например, (1,2, x) < (1,2, y) возвращает то же, что и x < у.
Стоит отметить, что SQL (или, по крайней мере, mysql) реализует это правильно:
mysql> select (200, 'B', 'C') < (333, 'B', 'B') and (333, 'B', 'B') < (1000, 'E', 'F');
+--------------------------------------------------------------------------+
| (200, 'B', 'C') < (333, 'B', 'B') and (333, 'B', 'B') < (1000, 'E', 'F') |
+--------------------------------------------------------------------------+
| 1 |
+--------------------------------------------------------------------------+
1 row in set (0.00 sec)
Здесь необходим SQL для создания примера:
create table mytable select 333 colA, 'B' colB, 'B' colC;
insert into mytable values (200, 'B', 'B'), (333, 'C', 'D'), (1000, 'E', 'G'),
(200, 'A', 'Z'), (1000, 'F', 'A'), (333, 'C', 'E'), (333, 'D', 'C'),
(99, 'A', 'A');
alter table mytable add unique index myindex (colA, colB, colC);
Добавление этого индекса приводит к тому, что таблица сортируется лексикографически, что интересно. Это не соответствует нашей производственной системе.