Сравнение столбца с самим собой в том случае, где Oracle Select Select

StackOverflow https://stackoverflow.com/questions/3138831

Вопрос

У меня есть несколько таблиц Выбор запроса, который сравнивает значения столбцов с собой, как ниже:

SELECT * FROM table1 t1,table2 t2
      WHERE t1.col1=t2.col1  --Different tables,So OK.
      AND t1.col1=t1.col1    --Same tables??
      AND t2.col1=t2.col1    --Same tables??

Это кажется мне избыточным. Мой запрос - это устранение их влияния на логику / производительность?

Заранее спасибо.

Это было полезно?

Решение

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

Если столбцы аннулируются, вы можете безопасно заменить эти строки (легче читать, проще для обслуживания):

  AND t1.col1 IS NOT NULL
  AND t2.col1 IS NOT NULL


Обновление после комментариев Джеффри

Вы абсолютно правы, я не знаю, как я его не видел: состояние присоединения t1.col1=t2.col1 Предполагается, что только строки с колоннами объединения не являются NULL, будут рассмотрены. Пункты tx.col1=tx.col1 поэтому полностью избыточны и могут быть безопасно удалены.

Другие советы

Нет Удалите их, пока не поймете влияние. Если, как указываются другие, они не влияют на запрос и, вероятно, оптимизированы, нет никакого вреда, чтобы их оставить там, но там мая причинить вред в удалении их.

Не пытайтесь исправить что-то, что работает, пока ваш блин не уверен, что вы не ломаете что-то еще.

Причина, по которой я упоминаю это, заключается в том, что мы унаследовали устаревшие отчетные приложения, имеющие именно эту конструкцию, по линии:

where id = id

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

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

Ну, представьте себе наше удивление на следующей итерации, когда база данных замедляется до доли своей прежней скорости, когда пользователи делали специальные запросы на id поле :-)

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

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

  1. Да, условия, очевидно, избыточны, так как они идентичны!

    SELECT * FROM table1 t1,table2 t2
    WHERE t1.col1=t2.col1
    
  2. Но вам нужно хотя бы один из них. В противном случае у вас будет картезианское соединение в ваших руках: каждая строка из Table1 будет присоединиться к каждой строке в таблице2. Если Таблица1 имела 100 строк, и Таблица 2 имела 1000 строк, полученный запрос вернет 100 000 результатов.

    SELECT * FROM table1 t1,table2 t2 --warning!
    
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top