Как сравнить две строки из одной и той-же таблице без дополнительного join или from?

Ссылка скопирована
1 ответ

Допустим есть ряд условий которые ограничивают набор до 5 - 10 строк
Таблица имеет большой размер данных
Выбрать строку где status - OPEN, но если есть другая строка со статусом status - CLOSED
Где statusId равен для двух строк.
Можно ли работать с выборкой из 5-10 строк а не джойнить огромную таблицу?

Дополнительно:

Самый тривиальный WHERE EXISTS. При правильной индексации - достаточно быстрое и ненагрузочное решение.

А ещё есть CTE. После которого self-join десяти строк - вообще ниачём.

Можно залить результат запроса, эти самые 5-10 строк, во временную таблицу и дальше работать с ней. Тогда не придётся джойнить большую таблицу.

  • Серьезно? Вот прямо так и не придется?
  • Роман Юрьевич Ипатьев, большую не придётся, только временную, которая маленькая саму к себе.
  • Ок, действительно, не придется.
    Но это не делает предложение с временной таблицей менее дурацким.
    Джойн по определению не составит никакой проблемы. Рекомендую почитать про индексы, и то как они помогают избежать поиска по большим таблицам.

    Ваш ответ - типичная чушь с форума, когда на дурацкий вопрос дают еще более дурацкий ответ.

  • Роман Юрьевич Ипатьев, тут очень много нюансов.
    Не все индексы полезны, а иногда даже вредны. Если требуется про сканировать 30% большой таблицы никакой индекс не поможет, он только накладных расходов добавит. Нужно учитывать селективносить и статистику.
    Ну и джойнить маленькие таблицы гораздо выгоднее чем большие, т.к. например меньше количество операций с диском, которые очень дорого стоят, а загнать всю большую таблицу в память не выйдет, а маленькую запросто.
    Тут классический подход - разделяй и властвуй.
  • если получается 5-10 строк, то селективность по определению высокая.

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

    Любые разговоры про временные таблицы, триггеры и денормализацию, которыми тут любят козырять в ответах, должны быть обоснованы. Данными, приведёнными в вопросе. А не нелепыми страхами автора вопроса и фантазиями доброхотов-отвечателей.

  • Вопрос весьма конкретный.
    Попробуй добавь индекс на много милионной таблице.
    На проде.
    Это будет тот еще гемор.
    Темболее что даже по индексу лудще в данном случае работать просто с сохраненными результатами.
    В крайнем случае обработать их на языке програмирования
    Что будет быстрее для 10-5 записей, чем повторно дергать таблицу
    .
  • IvanN777, всё это надо писать в вопросе. Структуру таблицы, индексы, эксплейн запроса без джойна и с ним.
    И тогда вам напишут нормальный ответ. Основанный на фактах. Возможно подойдет и временная таблица. Но скорее всего она не понадобится.
    А сейчас у вас вопрос наугад и ответ наугад.

Ответы:

Да, сделать выборку и джойнить её к самой себе.

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

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

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Артём Dev Ответ

Для сравнения двух строк из одной и той же таблицы без дополнительного использования JOIN или FROM, вы можете воспользоваться функцией GROUP BY в комбинации с условием HAVING.

Пример кода на языке PHP:

SELECT column_name
FROM table_name
GROUP BY column_name
HAVING COUNT(column_name) > 1;

SELECT column_name FROM table_name GROUP BY column_name HAVING COUNT(column_name) > 1;

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

Таким образом, данный запрос позволит вам сравнить две строки из одной и той же таблицы без использования дополнительных JOIN или FROM.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно