Подскажите по SQL

Dimon89

Eсть 2 задачи:
1.
надо чтот похожее на

select table1.* from table1 where not inner join (table2...)

получилось:

select t1.* from table1 as t1 where not t1.id in
(select ta1.id from table1 as ta1 inner join table2 as ta2 on ta1.table2_id=ta2.id)

задача - убрать вложенность
2.
надо что-то похожее на

select table1.* from table1 where is joined (table2...)

получилось:

select ta1.* from table1 as ta1 inner join table2 as ta2 on ta1.table2_id=ta2.id group by ta1.id

задача - убрать group by
Это возможно?

rosali

 select t1.* from table1 t1 left join table2 t2 on (t1.table2_id=t2.id) where t2.id is null 

sutulin

Возможно, я что-то не понял, но
 
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

rosali

Второй запрос вообще ерунда какая-то, как можно делать select * и group by. :confused: Да, id у строк в группе будет общий, а остальные колонки то как агрегировать? select distinct(id) можно, если ты об этом.

Dimon89

Второй запрос вообще ерунда какая-то, как можно делать select * и group by. Да, id у строк в группе будет общий, а остальные колонки то как агрегировать? select distinct(id) можно, если ты об этом.
Там select table.* а не select *, так что если id один, то и запись одна
distinct не хочется использовать, т.к. у него большие проблемы с производительностью

hprt

Если я тебя правильно понял, то в первом случае not exists, во втором exists. А вообще, напиши по-русски, что ты хочешь, потому что учитывая, какой бред с точки зрения sql ты написал, я совсем не уверен в том, что тебе нужно

hprt

вопрос абсолютно резонный. Если ты используешь MySQL, который это позволяет, то это все равно не повод писать криво

vic-sher

distinct не хочется использовать, т.к. у него большие проблемы с производительностью
А у группировки нет проблем с производительностью?

Dimon89

А у группировки нет проблем с производительностью?
Есть, поэтому от нее и хочется избавиться

Dimon89

А вообще, напиши по-русски, что ты хочешь, потому что учитывая, какой бред с точки зрения sql ты написал, я совсем не уверен в том, что тебе нужно
Я тут в испорченный телефон играю, уточню и напишу)

hprt

учитывая, что тут судя по всему не нужно ни то, ни другое, избавиться надо от всего :) впрочем, ждем, что же все-таки нужно

Dimon89

впрочем, ждем, что же все-таки нужно
Спасибо за ожидание, вот чуть более полный текст:
есть таблицы 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х групп)

khachin

1,2 или 4
Можно уточнить? "1 или 2 или 4" или "1 и 2 или 4"?

Dimon89

Можно уточнить? "1 или 2 или 4" или "1 и 2 или 4"?
все объекты к которым имеет доступ какая-нибудь из групп 1,2,4

hprt

нда, твой not inner join немного на другие мысли натолкнул, нежели чем "вытащить все obj к которым имеют доступ группы с id 1,2 или 4" :D
самое время спросить насчет того, какая субд, потому что для второй задачи оптимальность решения вполне зависит от этого

Dimon89

самое время спросить насчет того, какая субд, потому что для второй задачи оптимальность решения вполне зависит от этого
"Все вопросы задаются и для mysql и для mssql в раздельности"

hprt

и кстати про максимальный val тоже ничего нет в первом посте. Где-то видел в правилах оформлления поста требование описывать задачу, а не писать, что надо поправить в текущем запросе. Вроде на sql.ru, но сходу не нашел. В общем как раз тот случай

hprt

для mssql я бы делал через apply - получить максимум для конкретного objId. Через top или max не так важно. Для mysql надо делать группировку и джойнить. А вообще, раз проблемы с производительностью есть, не помешает еще информация об индексах, количестве строк и распределении данных :)

Dimon89

объектов не более нескольких миллионов
групп - тысячи, в запросе не более 10
привязок группа-объект в среднем чуть больше одной на объект
индексов пока нет, но можно добавить

luna89

Должно работать во всех субд кроме MySQL:

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)

hprt

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

sv-ha

Похоже на работающее, только группы не надо было вытаскивать
чуть позже сделаю тестовую базу - запущу все по скорости.
А для MySQL идеи есть ?

Ivan8209

> А для MySQL идеи есть ?
Выкинуть это поделие и заменить на нормальную СУБД.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."

sv-ha

> А для MySQL идеи есть ?
Выкинуть это поделие и заменить на нормальную СУБД.
Спасибо за помощь, только хотелось бы иметь более конструктивные ответы.

luna89

угу, только в твоем запросе не нужна таблица groups вообще никак,
Точно, мне показалось что поле val в таблице groups, а оно в group_obj
Оставить комментарий
Имя или ник:
Комментарий: