Oracle 简化并降低反联接查询的成本

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

您能帮我简化并降低以下查询的成本吗

我尝试将它设置为与notexists关联的子查询,但它没有给我任何输出

请注意,主查询和内部查询中的表都是相同的“表1”

提前感谢,,
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;