SQL: comparação de tupla

No meu aplicativo atual, preciso fazer esse tipo de consulta:

SELECT MIN((colA, colB, colC)) 
FROM mytable
WHERE (colA, colB, colC) BETWEEN (200, 'B', 'C') AND (1000, 'E', 'F')

e obtenha a resposta de(333, 'B', 'B'), dados estes dados:

+------+------+------+
| 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    |
+------+------+------+

Qual é a maneira mais eficiente de fazer isso em SQL real? Lembre-se de que este é um exemplo de brinquedo e que meu aplicativo atual possui tabelas com colunas e tipos de dados variados e centenas de milhões de linhas. Eu uso o MySQL, se isso ajuda. Você também pode supor que essas colunas tenham um índice PRIMARY ou UNIQU

Se a solução é facilmente extensível a mais / menos colunas, é ainda melho

Comparação dupla:

Vários pediram, então eu deveria colocar isso em questão. As tuplas são ordenadas lexicograficamente, o que significa que as seqüências são ordenadas da mesma forma que seus primeiros elementos diferentes. Por exemplo, (1,2, x) <(1,2, y) retorna o mesmo que x <y.

Vale a pena notar que o SQL (ou pelo menos o mysql) implementa isso corretamente:

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)

Aqui está o SQL necessário para criar o exemplo:

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);

Adicionar este índice parece fazer com que a tabela seja classificada lexicograficamente, o que é interessante. Isso não é verdade em nosso sistema de produçã

questionAnswers(2)

yourAnswerToTheQuestion