我们已经从第三方产品继承了一组表。其中一个表具有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会带来任何后果,还是有一种“更好”的方式呢?
谢谢。
最佳答案
另一种选择是使用UNION
或UNION 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
通常较慢,因为编译器无法再执行索引查找。除此之外,还可以。关于sql - Oracle SQL中的OR条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52702198/