我有一个表在oracle中有一个复合主键(pk有多列)。我正在运行SAMPLE查询以获取随机主键。
SELECT col1,col2,col3,col4 FROM table SAMPLE(0.1)WHERE col1 ='XXXXX'ORDER BY col2,col3,col4;
并且示例输出将是类似的
XXXXX 1 YYY A
XXXXX 2 ZZZ a
XXXXX 3 AAA b
XXXXX 4 BBB c
XXXXX 5 CCC c
XXXXX 6 DDD c
XXXXX 7 EEE i
现在,我希望获得前2个主键和接下来2个主键之间的所有行
一般模式是:
col1
小于col1
的比较值,那么该行是“较低”,即如果排序则更前面。col1
等于col1
的比较值,并且该行的col2
小于col2
的比较值,那么该行是“较低”,即如果排序则更前面。什么会导致表达如下:
col1 < '?'
OR col1 = '?'
AND col2 < '?'
OR col1 = '?'
AND col2 = '?'
AND col3 < '?'
OR col1 = '?'
AND col2 = '?'
AND col3 = '?'
AND col4 < '?'
OR col1 = '?'
AND col2 = '?'
AND col3 = '?'
AND col4 = '?'
(我没有使用你的价值观,老实说他们让我困惑。适当地更换问号。)
另一个方向的模式是模拟的。只需将>
从<
中取出。然后AND
两个子表达式。不要忘记在它们周围放置括号,以迫使OR
s先于((< sub expression for <= >) AND (< sub expression for >= >)
。
如果可能,您可能希望尝试使用布尔代数来简化它。 (这次我只是懒得尝试这样做。而且这种模式更容易识别。)但是,由于这对于优化器来说是一个简单的任务,如果可能的话可能会改变它,并且无论如何都会有所改进,但它没有太大的好处除了可能更好(人类)的可读性之外。