Oracle 简化并降低反联接查询的成本
您能帮我简化并降低以下查询的成本吗 我尝试将它设置为与notexists关联的子查询,但它没有给我任何输出 请注意,主查询和内部查询中的表都是相同的“表1” 提前感谢,,Oracle 简化并降低反联接查询的成本,oracle,Oracle,您能帮我简化并降低以下查询的成本吗 我尝试将它设置为与notexists关联的子查询,但它没有给我任何输出 请注意,主查询和内部查询中的表都是相同的“表1” 提前感谢,, Savitha尝试以下方法,看看是否有帮助: SELECT A.* FROM (SELECT * FROM Table_1 WHERE A.Col1 = 'abcd') A LEFT OUTER JOIN (SELECT Col2, Col3, primary_key_column
Savitha尝试以下方法,看看是否有帮助:
SELECT A.*
FROM (SELECT *
FROM Table_1
WHERE A.Col1 = 'abcd') A
LEFT OUTER JOIN (SELECT Col2, Col3, primary_key_column
FROM Table_1
WHERE (B.Col4 IN (1, 2, 3) AND
B.Col5 IN ('x', 'y')) OR
(B.Col4 = 1 AND
B.Col5 = 'z' AND
B.Col6 = 'f')) B
ON (B.Col2 = A.Col2 AND B.Col3 = A.Col3)
WHERE B.primary_key_column IS NULL;
您应该在TABLE1(Col1)、TABLE1(Col2、Col3)和TABLE1的主键列上有索引,不管它是什么
共享和享受。通常需要反复尝试。除了使用not exists和EXTER连接外,由于这是一个自连接,它应该减少到一个表
SELECT *
FROM Table_1
WHERE col1 = 'abcd'
AND NOT
(col4 IN (1,2,3)
AND col5 IN ('x','y')
)
AND NOT (col4=1
AND col5='z'
AND col6='f'
);
或者你可以试着用负号
SELECT *
FROM Table_1
WHERE col1 = 'abcd'
MINUS
SELECT *
FROM Table_1
WHERE col1 = 'abcd'
AND ((col4 IN (1,2,3)
AND col5 IN ('x','y'))
OR (col4=1
AND col5='z'
AND col6='f')
);
最有效的解决方案将取决于数据的传播
但它没有给我任何输出
你确定有匹配的行吗?回答很酷。
如果使用索引,下面的内容不应该相同吗
SELECT A.*
FROM Table_1 A
LEFT OUTER JOIN (SELECT Col2, Col3, primary_key_column
FROM Table_1
WHERE (B.Col4 IN (1, 2, 3) AND
B.Col5 IN ('x', 'y')) OR
(B.Col4 = 1 AND
B.Col5 = 'z' AND
B.Col6 = 'f')) B
ON (B.Col2 = A.Col2 AND B.Col3 = A.Col3)
WHERE A.Col1 = 'abcd'
and B.primary_key_column IS NULL;
为表(包括索引)提供DDL,并解释查询的计划输出。
SELECT A.*
FROM Table_1 A
LEFT OUTER JOIN (SELECT Col2, Col3, primary_key_column
FROM Table_1
WHERE (B.Col4 IN (1, 2, 3) AND
B.Col5 IN ('x', 'y')) OR
(B.Col4 = 1 AND
B.Col5 = 'z' AND
B.Col6 = 'f')) B
ON (B.Col2 = A.Col2 AND B.Col3 = A.Col3)
WHERE A.Col1 = 'abcd'
and B.primary_key_column IS NULL;