Как сравнить две строки из одной и той-же таблице без дополнительного join или from?
Допустим есть ряд условий которые ограничивают набор до 5 - 10 строк
Таблица имеет большой размер данных
Выбрать строку где status - OPEN, но если есть другая строка со статусом status - CLOSED
Где statusId равен для двух строк.
Можно ли работать с выборкой из 5-10 строк а не джойнить огромную таблицу?
Дополнительно:
Самый тривиальный WHERE EXISTS. При правильной индексации - достаточно быстрое и ненагрузочное решение.
А ещё есть CTE. После которого self-join десяти строк - вообще ниачём.
Можно залить результат запроса, эти самые 5-10 строк, во временную таблицу и дальше работать с ней. Тогда не придётся джойнить большую таблицу.
- Серьезно? Вот прямо так и не придется?
- Роман Юрьевич Ипатьев, большую не придётся, только временную, которая маленькая саму к себе.
- Ок, действительно, не придется.
Но это не делает предложение с временной таблицей менее дурацким.
Джойн по определению не составит никакой проблемы. Рекомендую почитать про индексы, и то как они помогают избежать поиска по большим таблицам.Ваш ответ - типичная чушь с форума, когда на дурацкий вопрос дают еще более дурацкий ответ.
- Роман Юрьевич Ипатьев, тут очень много нюансов.
Не все индексы полезны, а иногда даже вредны. Если требуется про сканировать 30% большой таблицы никакой индекс не поможет, он только накладных расходов добавит. Нужно учитывать селективносить и статистику.
Ну и джойнить маленькие таблицы гораздо выгоднее чем большие, т.к. например меньше количество операций с диском, которые очень дорого стоят, а загнать всю большую таблицу в память не выйдет, а маленькую запросто.
Тут классический подход - разделяй и властвуй. - если получается 5-10 строк, то селективность по определению высокая.
ещё раз. ваш ответ - типичная чушь с форума, когда на вопрос нуба "а как мне отрубить ногу, а то болит очень" начинают давать советы как это лучше сделать вместо того чтобы рассказать как вытащить занозу.
Приходит такой "сеньор-помидор", и начинает разговаривать сам с собой. Выдумывает себе селективность, статистику, накладные расходы, и для решения примитивной задачи предлагает делать каких-то ненужных монстров.Любые разговоры про временные таблицы, триггеры и денормализацию, которыми тут любят козырять в ответах, должны быть обоснованы. Данными, приведёнными в вопросе. А не нелепыми страхами автора вопроса и фантазиями доброхотов-отвечателей.
- Вопрос весьма конкретный.
Попробуй добавь индекс на много милионной таблице.
На проде.
Это будет тот еще гемор.
Темболее что даже по индексу лудще в данном случае работать просто с сохраненными результатами.
В крайнем случае обработать их на языке програмирования
Что будет быстрее для 10-5 записей, чем повторно дергать таблицу
. - IvanN777, всё это надо писать в вопросе. Структуру таблицы, индексы, эксплейн запроса без джойна и с ним.
И тогда вам напишут нормальный ответ. Основанный на фактах. Возможно подойдет и временная таблица. Но скорее всего она не понадобится.
А сейчас у вас вопрос наугад и ответ наугад.
Ответы:
Да, сделать выборку и джойнить её к самой себе.
Вопрос, как всегда, дурацкий.
Звучит как "а можно есть суп без ложки?". И дальше в оправдание нелепые страхи.
Надо не бояться "джойнить огромную таблицу" а учиться оптимизировать запросы.
В данном случае никакой проблемы с джойном нет .
Если будет тормозить, поставить нужный индекс, как минимум по statusId
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для сравнения двух строк из одной и той же таблицы без дополнительного использования JOIN или FROM, вы можете воспользоваться функцией GROUP BY в комбинации с условием HAVING.
Пример кода на языке PHP:
SELECT column_name FROM table_name GROUP BY column_name HAVING COUNT(column_name) > 1;
В данном коде мы выбираем столбец column_name из таблицы table_name, затем группируем записи по значению этого столбца с помощью GROUP BY. Далее, с помощью HAVING мы фильтруем только те записи, у которых количество повторений в столбце больше одного, что означает, что строки сравниваются между собой.
Таким образом, данный запрос позволит вам сравнить две строки из одной и той же таблицы без использования дополнительных JOIN или FROM.