Подскажите по SQL
select t1.* from table1 t1 left join table2 t2 on (t1.table2_id=t2.id) where t2.id is null
select table1.* from table1 left join table2 as ta2 on table1.table2_id=ta2.id WHERE ta2.id IS NULL
2. Как вариант, убрать group by, но использовать SELECT DISTINCT
Второй запрос вообще ерунда какая-то, как можно делать select * и group by. Да, id у строк в группе будет общий, а остальные колонки то как агрегировать? select distinct(id) можно, если ты об этом.
Второй запрос вообще ерунда какая-то, как можно делать select * и group by. Да, id у строк в группе будет общий, а остальные колонки то как агрегировать? select distinct(id) можно, если ты об этом.Там select table.* а не select *, так что если id один, то и запись одна
distinct не хочется использовать, т.к. у него большие проблемы с производительностью
Если я тебя правильно понял, то в первом случае not exists, во втором exists. А вообще, напиши по-русски, что ты хочешь, потому что учитывая, какой бред с точки зрения sql ты написал, я совсем не уверен в том, что тебе нужно
вопрос абсолютно резонный. Если ты используешь MySQL, который это позволяет, то это все равно не повод писать криво
distinct не хочется использовать, т.к. у него большие проблемы с производительностьюА у группировки нет проблем с производительностью?
А у группировки нет проблем с производительностью?Есть, поэтому от нее и хочется избавиться
А вообще, напиши по-русски, что ты хочешь, потому что учитывая, какой бред с точки зрения sql ты написал, я совсем не уверен в том, что тебе нужноЯ тут в испорченный телефон играю, уточню и напишу)
учитывая, что тут судя по всему не нужно ни то, ни другое, избавиться надо от всего впрочем, ждем, что же все-таки нужно
впрочем, ждем, что же все-таки нужноСпасибо за ожидание, вот чуть более полный текст:
есть таблицы Objs (id, name Groups(id,name groups_objs(group_id,obj_id,val)
последняя таблица - это то, что группа с номером group_id имеет доступ к объекту с obj_id
groups_objs.val - int
есть 2 задачи:
1. вытащить все obj к которым имеют доступ группы с id 1,2 или 4
2. вытащить все obj к которым имеют доступ группы с id 1,2 или 4 и максимальный val из groups_objs (с очевидностью для данного obj и выбранных 3х групп)
1,2 или 4Можно уточнить? "1 или 2 или 4" или "1 и 2 или 4"?
Можно уточнить? "1 или 2 или 4" или "1 и 2 или 4"?все объекты к которым имеет доступ какая-нибудь из групп 1,2,4
самое время спросить насчет того, какая субд, потому что для второй задачи оптимальность решения вполне зависит от этого
самое время спросить насчет того, какая субд, потому что для второй задачи оптимальность решения вполне зависит от этого
"Все вопросы задаются и для mysql и для mssql в раздельности"
и кстати про максимальный val тоже ничего нет в первом посте. Где-то видел в правилах оформлления поста требование описывать задачу, а не писать, что надо поправить в текущем запросе. Вроде на sql.ru, но сходу не нашел. В общем как раз тот случай
для mssql я бы делал через apply - получить максимум для конкретного objId. Через top или max не так важно. Для mysql надо делать группировку и джойнить. А вообще, раз проблемы с производительностью есть, не помешает еще информация об индексах, количестве строк и распределении данных
групп - тысячи, в запросе не более 10
привязок группа-объект в среднем чуть больше одной на объект
индексов пока нет, но можно добавить
select
obj.*, max(val) over (partition by obj.id)
from
groups, obj, group_obj
where
groups.id = group_obj.group_id and
obj.id = group_obj.obj_id and
groups.id in (1,2,4)
угу, только в твоем запросе не нужна таблица groups вообще никак, будут дубликаты в записях, ну и вообще писать через запятую таблицы это фу
чуть позже сделаю тестовую базу - запущу все по скорости.
А для MySQL идеи есть ?
Выкинуть это поделие и заменить на нормальную СУБД.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
> А для MySQL идеи есть ?Спасибо за помощь, только хотелось бы иметь более конструктивные ответы.
Выкинуть это поделие и заменить на нормальную СУБД.
угу, только в твоем запросе не нужна таблица groups вообще никак,Точно, мне показалось что поле val в таблице groups, а оно в group_obj
Оставить комментарий
Dimon89
Eсть 2 задачи:1.
надо чтот похожее на
получилось:
задача - убрать вложенность
2.
надо что-то похожее на
получилось:
задача - убрать group by
Это возможно?