我有3个表,其ID有不同的范围。例如,表a具有ID <1000000,表b具有ID(从10000001到2000000),表c具有ID&gt; 2000000。我根据每个表的范围在3个表上创建了检查约束。后来,我使用union all创建了一个引用三个表的视图。当我使用ID条件(= xxx)查询视图时,它将仅查询存储数据的表,并忽略查询其他2个表。它按照我的预期运行。
但是如果列类型是char(xx),并且我将检查约束设置为(例如&#39; a%&#39;表a,例如&#39; b%&#39;表b,类似于表c)中的c%&#39;然后使用name =&#39; bcd&#39;查询视图。在观察执行计划之后,它实际上将查询3个表。检查约束无助于忽略查询没有数据的2个表。
所以,我的问题是当检查约束引用了字符列时出了什么问题?
答案 0 :(得分:2)
正如documentation所解释的那样:
表T1中定义的约束C1必须具有以下形式:
C1 ::= < simple_interval > [ OR < simple_interval > OR ...] < simple_interval > :: = < col > { < | > | \<= | >= | = < value >} | < col > BETWEEN < value1 > AND < value2 > | < col > IN ( value_list ) | < col > { > | >= } < value1 > AND < col > { < | <= } < value2 >
LIKE
不是允许的操作之一。
因此,将约束更改为:
col >= 'a' and col < 'b'
col >= 'b' and col < 'c'
col >= 'c' and col < 'd'