Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

Перекомпоновать таблицу в SQL запросе   Найти похожие ветки 

 
normandia   (2004-05-09 21:34) [0]

Есть таблица со следующей структурой
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 запрос.
Можно ли это сделать? Если можно, прошу подсказать как (с примером).

Заранее благодарю.


 
sniknik ©   (2004-05-09 23:12) [1]

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

благодарность надо не заранее, надо в литрах, можно по почте.


 
Курдль ©   (2004-05-10 00:52) [2]


> благодарность надо не заранее, надо в литрах, можно по почте.

За такой совет, как в [1], в литрах не получтся. Задача сложнее т.к. под "таблицей со следующей структурой" понималась именно структура, а не данные. Так что при появлении 3-го параметра Ваш запрос не сработает :(
http://delphimaster.net/view/3-1083242996/


 
Johnmen ©   (2004-05-10 01:13) [3]

>normandia  

Требуется внятное изложение того, что надо....
Из приведённого примера это не ясно...


 
sniknik ©   (2004-05-10 09:56) [4]

почему не сработает? сработает, только результат будет неадекватен, не то что ожидалось. естественно, под другие условия другой запрос.


 
normandia   (2004-05-10 18:58) [5]

2 Johnmen
Вопрос поставлен вполне внятно. Другие поняли совершенно верно и даже подсказали в тему.
В результирующей таблице для каждого объекта должна быть одна строка со списком всех параметров. А в исходной таблице для каждого параметра одна строка. Вот и все.
В общем виде параметров может быть и больше двух.
У меня около 10. Это как раз рассмотрено в
http://delphimaster.net/view/3-1083242996/

Уважаемый Курдль меня отослал туда, куда нужно:)
Все заработало, только пока медленно.
Почему-то left join делает неиндексированное чтение,
а записей более 100000. Поэтому обрабатывается долго.
Индексы вроде все нужные есть. Пытаюсь разобраться.

А так спасибо (3 литра):)


 
normandia   (2004-05-10 20:33) [6]

Все заработало!
Вместо left join по какому-то наитию поставил просто join.
Оптимизатор сам составил план запроса с использованием нужного индекса. Все залетало мухой. (кстати я поскромничал, в моей базе около 2 000 000 записей)

Попутно назрел вопрос.
А чем таким особенным отличаются left join и простой join с точки зрения использования индексов?
А то сделать то сделал, но только это было чистое шаманство:) (то есть знаю как добиться результата, но не знаю как это работает).
Неприятно так программы писать.


 
Курдль ©   (2004-05-10 20:54) [7]

Я в том обсуждении, ссылку на которое дал, предлагал вариант без join-ов. Проверь - самому интересно, быстрее, или нет.


 
kaif ©   (2004-05-11 01:35) [8]

Интересно, а как будет работать Ваш иннер джойн, если у какого-то из объектов отсутствует хотя бы один из 10 параметров? Или Вас устраивет, если такие объекты пропадут?
 И почему именно такая организация хранения данных? Я, когда только начинал работать с IB, самую первую свою базу данных тоже так организовал. Но потом больше никогда так не делал.
 :)
 Я не то, чтобы настаиваю, что так неправильно. Просто хотелось бы услышать, почему это сделано именно так?


 
normandia   (2004-05-11 12:13) [9]

2 Курдль
Вариант без join по быстродействию работает абсолютно также (время выполнения запроса ~15ms).

Вообще, я так понял, что вариант с join появился потому,что в ветке форума, на которую была дана ссылка, рассматривалась база с тремя, а не сдвумя таблицами:
1. Список объектов с указанием их типов.
2. Список возможных типов параметров с указанием их имен и приналежности каждого параметра к определенному типу объекта.
3. Список значений с указанем объекта и типа параметра.

join был применен потому, что выбор из таблицы 2 делается по имени параметра, а информации об имени в таблице 3 нет, есть только ID типа параметра.

Я сделал запрос по ID параметра (как предлагал Курдль), теперь необходимость в join отпала.

2 kaif
Такая структура нужна, если набор параметров объекта определенного типа может время от времени меняться. Тогда все сводится к изменениям в таблице 2. При этом количество доступных параметров определяется отдельным запросом, а потом программно набирается окончательный запрос.

Кстати, если какого-либо необходимого параметра нет, запрос работает правильно. А именно, соответствующее поле в строке результата будет равно NULL. Сам объект из выборки не исчезает.
Именно так и надо.

Вообще-то эта база досталась мне в готовом виде (только на Paradox 3.5). Заказчику надо было перегнать ее в IB и переписать программу доступа.



Страницы: 1 вся ветка

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
4-1081638815
Gott
2004-04-11 03:13
2004.05.30
Уникальное сообщение


11-1074237028
<Falcon>
2004-01-16 10:10
2004.05.30
QueryEndSession и вход в систему под другим именем


14-1084258122
Ega23
2004-05-11 10:48
2004.05.30
Всем привет! Я вернулся!


1-1084586814
IrBisoff
2004-05-15 06:06
2004.05.30
Немного глуповат вопрос, но StrLeft не обрабатывает строку.


14-1084299277
ИМХО
2004-05-11 22:14
2004.05.30
Почему Adobe Acrobat?