首页 > 解决方案 > 获取两个不同复合主键之间的所有记录

问题描述

我有一个表,它在 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 个主键之间的所有行

标签: oraclecomposite-primary-key

解决方案


那么一般模式是:

  • 如果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是两个子表达式。不要忘记将括号括起来,以强制ORs 在 ( (< sub expression for <= >) AND (< sub expression for >= >).

如果可能,您可能想尝试使用布尔代数来简化它。(这一次我只是懒得尝试这样做。而且这种模式更容易识别。)但是由于这对优化器来说是一个简单的任务,如果可能的话,它可能会改变它并且无论如何都有希望,因此没有太多好处除了可能更好的(人类)可读性之外。


推荐阅读