![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перекомпоновать таблицу в SQL запросе [D5, IB6.x]
normandia © (2004-05-09 21:34:00)Есть таблица со следующей структурой
OBJ PARAM ZNAHC
--------------------------
объект1 1 3.2
объект1 2 5.7
объект2 1 4.5
объект2 2 6.3
Данные таблицы надо отобразить в виде
OBJ PARAM1 PARAM2
--------------------------
объект1 3.2 5.7
объект2 4.5 6.3
Xотелось бы получить результат через SQL запрос.
Можно ли это сделать? Если можно, прошу подсказать как (с примером).
Заранее благодарю.
normandia (2004-05-11 12:13:00) [1]2 Курдль
Вариант без join по быстродействию работает абсолютно также (время выполнения запроса ~15ms).
Вообще, я так понял, что вариант с join появился потому,что в ветке форума, на которую была дана ссылка, рассматривалась база с тремя, а не сдвумя таблицами:
1. Список объектов с указанием их типов.
2. Список возможных типов параметров с указанием их имен и приналежности каждого параметра к определенному типу объекта.
3. Список значений с указанем объекта и типа параметра.
join был применен потому, что выбор из таблицы 2 делается по имени параметра, а информации об имени в таблице 3 нет, есть только ID типа параметра.
Я сделал запрос по ID параметра (как предлагал Курдль), теперь необходимость в join отпала.
2 kaif
Такая структура нужна, если набор параметров объекта определенного типа может время от времени меняться. Тогда все сводится к изменениям в таблице 2. При этом количество доступных параметров определяется отдельным запросом, а потом программно набирается окончательный запрос.
Кстати, если какого-либо необходимого параметра нет, запрос работает правильно. А именно, соответствующее поле в строке результата будет равно NULL. Сам объект из выборки не исчезает.
Именно так и надо.
Вообще-то эта база досталась мне в готовом виде (только на Paradox 3.5). Заказчику надо было перегнать ее в IB и переписать программу доступа.
kaif (2004-05-11 01:35:00) [2]Интересно, а как будет работать Ваш иннер джойн, если у какого-то из объектов отсутствует хотя бы один из 10 параметров? Или Вас устраивет, если такие объекты пропадут?
И почему именно такая организация хранения данных? Я, когда только начинал работать с IB, самую первую свою базу данных тоже так организовал. Но потом больше никогдатак не делал.
:)
Я не то, чтобы настаиваю, что так неправильно. Просто хотелось бы услышать, почему это сделано именно так?
Курдль (2004-05-10 20:54:00) [3]Я в том обсуждении, ссылку на которое дал, предлагал вариант без join-ов. Проверь - самому интересно, быстрее, или нет.
normandia (2004-05-10 20:33:00) [4]Все заработало!
Вместо left join по какому-то наитию поставил просто join.
Оптимизатор сам составил план запроса с использованием нужного индекса. Все залетало мухой. (кстати я поскромничал, в моей базе около 2 000 000 записей)
Попутно назрел вопрос.
А чем таким особенным отличаются left join и простой join с точки зрения использования индексов?
А то сделать то сделал, но только это было чистое шаманство:) (то есть знаю как добиться результата, но не знаю как это работает).
Неприятно так программы писать.
normandia (2004-05-10 18:58:00) [5]2 Johnmen
Вопрос поставлен вполне внятно. Другие поняли совершенно верно и даже подсказали в тему.
В результирующей таблице для каждого объекта должна быть одна строка со списком всех параметров. А в исходной таблице для каждого параметра одна строка. Вот и все.
В общем виде параметров может быть и больше двух.
У меня около 10. Это как раз рассмотрено в
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1083242996&n=1
Уважаемый Курдль меня отослал туда, куда нужно:)
Все заработало, только пока медленно.
Почему-то left join делает неиндексированное чтение,
а записей более 100000. Поэтому обрабатывается долго.
Индексы вроде все нужные есть. Пытаюсь разобраться.
А так спасибо (3 литра):)
sniknik (2004-05-10 09:56:00) [6]почему не сработает? сработает, только результат будет неадекватен, не то что ожидалось. естественно, под другие условия другой запрос.
Johnmen (2004-05-10 01:13:00) [7]>normandia
Требуется внятное изложение того, что надо....
Из приведённого примера это не ясно...
Курдль (2004-05-10 00:52:00) [8]
> благодарность надо не заранее, надо в литрах, можно по почте.
За такой совет, как в [1], в литрах не получтся. Задача сложнее т.к. под " таблицей со следующей структурой" понималась именно структура, а не данные. Так что при появлении 3-го параметра Ваш запрос не сработает :(
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1083242996&n=1
sniknik (2004-05-09 23:12:00) [9]SELECT a.OBJ, a.ZNAHC AS PARAM1, b.ZNAHC AS PARAM2
FROM Table1 a INNER JOIN Table1 b ON a.OBJ=b.OBJ AND a.PARAM<b.PARAM
благодарность надо не заранее, надо в литрах, можно по почте.