Есть главная таблица
Пользователи:
ID , Фамилия поля таблицы
Есть дочерняя таблица
Описания:
ID,
Описание
Таблица Пользователи связана с таблицей Описания связью один-к-одному по полю ID (те не все пользователи имеют описание)
Скажите как быстрее всего произвести загрузку из этих таблиц.
На данный момент я делаю так
Выполняю хранимую процедуру и загружаю данные в приложение
select ID , Фамилия from Пользователи where <мое условие>
затем формирую новый запрос из всех ID предыдущего запроса
select ID , Описание from Описания where ID in(1,2,3,..................................................)
Тк данных очень много то второй запрос иногда не выполняется из-за нехватки памяти
Скажите можно ли это сделать быстрее и красивее.
Здравствуйте, binom82, Вы писали:
B>Есть главная таблица B>Пользователи: B>ID , Фамилия поля таблицы
B>Есть дочерняя таблица B>Описания: B>ID, B>Описание
B>Таблица Пользователи связана с таблицей Описания связью один-к-одному по полю ID (те не все пользователи имеют описание)
B>Скажите как быстрее всего произвести загрузку из этих таблиц. B>На данный момент я делаю так
B>Выполняю хранимую процедуру и загружаю данные в приложение B>select ID , Фамилия from Пользователи where <мое условие>
B>затем формирую новый запрос из всех ID предыдущего запроса
B>select ID , Описание from Описания where ID in(1,2,3,..................................................) B>Тк данных очень много то второй запрос иногда не выполняется из-за нехватки памяти B>Скажите можно ли это сделать быстрее и красивее.
SELECT нужные поля
FROM Пользователи
LEFT JOIN Описания ON Пользователи.ID = Описания.ID
WHERE твое условие
А почему бы не хранить "Описание" в первой таблице если у них 1 к 1?
Здравствуйте, binom82, Вы писали:
B>Есть главная таблица B>Пользователи: B>ID , Фамилия поля таблицы
B>Есть дочерняя таблица B>Описания: B>ID, B>Описание B>Таблица Пользователи связана с таблицей Описания связью один-к-одному по полю ID (те не все пользователи имеют описание) B>Скажите как быстрее всего произвести загрузку из этих таблиц. B>На данный момент я делаю так B>Выполняю хранимую процедуру и загружаю данные в приложение B>select ID , Фамилия from Пользователи where <мое условие>
B>затем формирую новый запрос из всех ID предыдущего запроса
B>select ID , Описание from Описания where ID in(1,2,3,..................................................) B>Тк данных очень много то второй запрос иногда не выполняется из-за нехватки памяти B>Скажите можно ли это сделать быстрее и красивее.
SELECT usv.ID, usv.Фамилия, ISNULL(descr.Description, "") AS Описание
from Пользователи usv
LEFT OUTER JOIN
Описания descr
ON usv.ID = descr.ID
Здравствуйте, binom82, Вы писали:
B>В одну таблицу объединять все нельзя. Дочерних таблиц на самом деле много, я привел просто самый простой пример
Вам не предлагали объединять в одну таблицу
RTFM SQL Reference
N>Вам не предлагали объединять в одну таблицу N>RTFM SQL Reference
А что вы тогда предлагаете? Поясните ссылку(справочник по sql я и сам найти могу)
А как получить результат с помошью операции join я и сам знаю. Только мне чета не охота вытаскивать
все поля дочерних таблиц из гавного запроса(их просто много)
Здравствуйте, binom82, Вы писали:
B>А что вы тогда предлагаете? Поясните ссылку(справочник по sql я и сам найти могу) B>А как получить результат с помошью операции join я и сам знаю. Только мне чета не охота вытаскивать B>все поля дочерних таблиц из гавного запроса(их просто много)
чего Вам хочется, а чего нет — ведомо только Вам, а нам Вы ничего не сообщили
что имеете под "вытаскивать все поля дочерних таблиц из гавного запроса" не ясно
ссылку на документацию дал, т.к. из начальной постановки Вашего вопроса подумалось, что Вы не знаете SQL
выполните предложенный скрипт и напишите точно, что именно в нем не устраивает
Каждый результат запроса загужается в клиентсоком приложении в свой DataTable.
Если я солью все в один результат, тоя я умру все это потом делить, тем более что дочерних таблиц несколько.
Я хоте бы чтобы было примерно так (чтобы процедура возвращала несколько результатов select и по возможности не делала повторных вычислении)
create procedure
{
select ID , Фамилия from Пользователи where <мое условие> //Запрос из главной таблицы
//На этом этапе ID для поиска уже известны и я подумал что их можно както использовать, а не выполнять следующий запрос полностью
SELECT Описания.ID,Описания.Описание //Запрос из дочерней таблицы
FROM Пользователи
LEFT JOIN Описания ON Пользователи.ID = Описания.ID
WHERE <мое условие>
Здравствуйте, binom82, Вы писали: B>create procedure B>{ B> select ID , Фамилия from Пользователи where <мое условие> //Запрос из главной таблицы
B> //На этом этапе ID для поиска уже известны и я подумал что их можно както использовать, а не выполнять следующий запрос полностью
B> SELECT Описания.ID,Описания.Описание //Запрос из дочерней таблицы B> FROM Пользователи B> LEFT JOIN Описания ON Пользователи.ID = Описания.ID B> WHERE <мое условие>
B> // и так далее.... B>}
уже понятнее, спасибо
но всё ещё не ясно, чем не устраивает:
select u.id,
ref.name, ref2.name, ref3.name, ...
from users u
left join reference ref
on u.id = ref.u_id
left join reference ref2
on u.id = ref2.u_id
left join reference ref3
on u.id = ref3.u_id
...
where <Ваше условие>
Здравствуйте, binom82, Вы писали:
B>Здравствуйте, niteshade123, Вы писали:
B>Каждый результат запроса загужается в клиентсоком приложении в свой DataTable. B>Если я солью все в один результат, тоя я умру все это потом делить, тем более что дочерних таблиц несколько.
B>Я хоте бы чтобы было примерно так (чтобы процедура возвращала несколько результатов select и по возможности не делала повторных вычислении)
B>create procedure B>{ B> select ID , Фамилия from Пользователи where <мое условие> //Запрос из главной таблицы
B> //На этом этапе ID для поиска уже известны и я подумал что их можно както использовать, а не выполнять следующий запрос полностью
B> SELECT Описания.ID,Описания.Описание //Запрос из дочерней таблицы B> FROM Пользователи B> LEFT JOIN Описания ON Пользователи.ID = Описания.ID B> WHERE <мое условие>
B> // и так далее.... B>}
Моск взорван........
Хочу предложить Вам, поменять "справочник по sql" на большую кирпичную стену.
Простите за мою вежливость.
N>select u.id,
N> ref.name, ref2.name, ref3.name, ...
N>from users u
N> left join reference ref
N> on u.id = ref.u_id
N> left join reference ref2
N> on u.id = ref2.u_id
N> left join reference ref3
N> on u.id = ref3.u_id
N>...
N>where <Ваше условие>
N>
Не устраивает обработкой результата этого общего запроса в клиентском приложении.
Представляете если я солью все дочерние таблицы в один результат, сколько мне их потом нужно выделять в клинстком приложении
Здравствуйте, binom82, Вы писали:
B>Представляете если я солью все дочерние таблицы в один результат, сколько мне их потом нужно выделять в клинстком приложении
Какие все дочерние? Что Вы там такое убойное курите?
Здравствуйте, binom82, Вы писали:
B>Я хоте бы чтобы было примерно так (чтобы процедура возвращала несколько результатов select и по возможности не делала повторных вычислении)
B>create procedure
B>{
B> select ID , Фамилия from Пользователи where <мое условие> //Запрос из главной таблицы
B> //На этом этапе ID для поиска уже известны и я подумал что их можно както использовать, а не выполнять следующий запрос полностью
select ID , Фамилия
into #Temp
from Пользователи
where <мое условие>
select *
from #Temp
SELECT Описания.ID,Описания.Описание
FROM Описания
WHERE Описания.ID in(select ID from #Temp)
B> // и так далее....
B>}
Здравствуйте, binom82, Вы писали:
B>Не устраивает обработкой результата этого общего запроса в клиентском приложении. B>Представляете если я солью все дочерние таблицы в один результат, сколько мне их потом нужно выделять в клинстком приложении
Итак:
1. Есть мастер-таблица
2. Есть несколько деталей с отношением 1-1 к мастеру
3. Запрос master join detail1 join detail2 ... не катит (почему?)
4. Серия запросов master join detail1, master join detail2 ... не катит (почему?)
Здравствуйте, binom82, Вы писали:
B>Есть главная таблица B>Пользователи: B>Есть дочерняя таблица B>Описания:
Если у обоих таблиц на ID висит индекс, то JOIN (про который тебе уже рассказали) из двух этих таблиц будет быстрый пребыстрый. И быстрее чем то что ты вначале описал.
А какая БД?
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков