Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

Перекомпоновать таблицу в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.035 c
8-1075586058
Exciter
2004-02-01 00:54
2004.05.30
Как проиграть MIDI файл без TMediaPlayer ?


6-1081799593
DED_MustDie
2004-04-12 23:53
2004.05.30
non-blocking


1-1084879995
MegaVolt
2004-05-18 15:33
2004.05.30
Как оформить информацию получаемую из файлов с разными форматами?


3-1083916302
Nitrix
2004-05-07 11:51
2004.05.30
Сбросить счетчик в dbf


14-1084340196
kopcap
2004-05-12 09:36
2004.05.30
Как удалить фаил........





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский