Oracle SQL中的OR条件

小炸

我们已经从第三方产品继承了一组表。其中一个表具有2个外键约束,这些约束链接到父表的同一列。我简化了表格来演示这一点:

CREATE TABLE profile_defn 
(   
  profile_id NUMBER(10,0), 
  profile_name  VARCHAR2(50),
  CONSTRAINT pk1 PRIMARY KEY (profile_id)
);

CREATE TABLE letter_defn 
(
  letter_defn_id  NUMBER(10,0), 
  letter_name     VARCHAR2(50 BYTE), 
  orig_print_id   NUMBER(10,0),
  new_print_id    NUMBER(10,0),
  CONSTRAINT fk1 FOREIGN KEY (orig_print_id) REFERENCES profile_defn (profile_id) ENABLE,
  CONSTRAINT fk2 FOREIGN KEY (new_print_id) REFERENCES profile_defn (profile_id) ENABLE
);

INSERT INTO profile_defn
VALUES
(
  1,
  'profile1'
);

INSERT INTO profile_defn
VALUES
(
  2,
  'profile2'
);

INSERT INTO profile_defn
VALUES
(
  3,
  'profile3'
);

INSERT INTO letter_defn
VALUES 
(
  1,
  'letter1',
  1,
  2
);

INSERT INTO letter_defn
VALUES 
(
  1,
  'letter2',
  2,
  3
);

因此,在连接两个表时,存在一个OR条件,因为它需要标识任一列上的匹配记录:

SELECT * FROM letter_defn ld
JOIN profile_defn p 
ON ld.orig_print_id = p.profile_id OR ld.new_print_id = p.profile_id;

在JOIN中使用OR会带来任何后果,还是有一种“更好”的方式呢?

谢谢。

萨加斯

一种替代方法是使用UNIONUNION ALL可能具有更好的执行计划:

SELECT * FROM letter_defn ld 
JOIN profile_defn p ON ld.orig_print_id = p.profile_id 
UNION
SELECT * FROM letter_defn ld 
JOIN profile_defn p ON ld.new_print_id = p.profile_id;

consequences是,or通常比较慢是因为编译器不能再执行一个索引查找。除此之外,还可以。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章