Упрощение и снижение стоимости запроса на объединение - PullRequest
0 голосов
/ 29 декабря 2010

Не могли бы вы помочь мне в упрощении и снижении стоимости запроса ниже?

Я пытался сделать это подзапросом, связанным с NOT EXISTS, но он не дал мне никакого вывода.

Обратите внимание, что таблица в основном и внутреннем запросе - это одно и то же 'table_1 ".

SELECT *
FROM Table_1 A
WHERE A.Col1              = 'abcd'
AND (A.Col2, A.Col3) NOT IN
  (SELECT Col2,
    Col3
  FROM Table_1 B
  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')
  ))

Спасибо заранее, САВИТА

Ответы [ 3 ]

0 голосов
/ 29 декабря 2010

Обычно много о пробах и ошибках.В дополнение к использованию несуществующего и внешнего соединения, поскольку это самостоятельное соединение, оно должно сводиться к одной таблице ...

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')  
);

Наиболее эффективное решение будет зависеть от распространения данных.

, но оно не дало мне никакого вывода

Выуверены, что есть совпадающие строки?

0 голосов
/ 29 декабря 2010

Классный ответ. Не должно ли быть то же самое, если используются индексы

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;
0 голосов
/ 29 декабря 2010

Попробуйте следующее, чтобы увидеть, помогает ли это:

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, каким бы он ни был.

Делись и наслаждайся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...