在我目前的應用程序中,我需要能夠做這種類型的查詢:SQL:元組比較
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 < y相同的值。
值得一提的是,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);
添加該指數似乎導致表按字典順序排序,這很有趣。我們的生產系統並不是這樣。
你是如何定義的元組排序? – 2011-03-31 21:52:43
對於記錄來說,'('B','K','K')'不會使'BETWEEN'條件成爲行,對吧? – 2011-03-31 22:09:11
@ypercube:是的。 (B,K,K)在(A,B,C)和(D,E,F)之間排序 – bukzor 2011-03-31 22:16:47