gpt4 book ai didi

sql - Oracle SQL 中的 OR 条件

转载 作者:行者123 更新时间:2023-12-05 01:11:02 26 4
gpt4 key购买 nike

我们从第三方产品继承了一组表格。其中一个表有 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
);

因此,当连接 2 个表时,有一个 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;

后果通常较慢,因为编译器无法再执行索引查找。除此之外,没关系。

关于sql - Oracle SQL 中的 OR 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52702198/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com