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

Вниз

Объеденить несколько строк из таблицы в отдну строку.   Найти похожие ветки 

 
Draught   (2007-10-01 17:11) [0]

День добрый.

Есть 2 таблицы table1 и table2

table1
ID - autoincrement
Unit - Text
...
Notes - Text

table2
ID - autoincrement
Table1ID - Integer
Name - Text
Count - Integer

свяpm вроде очевидна
table1.ID 1--M table2.Table1ID

Теперь задача:
Нужно наваять запрос, в котором для каждой записи из table1 будет соответствовать единственная запись (строка), содержащая в себе все поля из первой таблицы и соответствующие записи второй таблицы.

Пример:
table1
ID | Unit | ... | Notes
1  | First |     | бла-бла
2  | Sec |     | бла-бла-бла

table2
ID | Table1.ID | Name | Counter
1  | 1            | FF     | 5
2  | 1            | HH     | 6
3  | 2            | FF     | 4
4  | 1            | AN     | 8
5  | 1            | CK     | 3

результат:
ID | Unit | ... | Notes      | N1 | C1 | N2 | C2 | N3 | C3 | N4 | C4 |
1  | First |     | бла-бла  | FF | 5   | HH | 6   | AN | 8   | CK | 3  |
...

Выбрать все строки подряд по очереди не сложно, просто меняем номер строки и количество строк, переменные так же не сложно подобрать, но вот как сделать это все в одном запросе? например хотя бы на 4 строки, как в примере выше?

Ну и выбор нужной строки примерно так выглядит
SELECT name as Name:From, Count as Count:From FROM table2
LIMIT :From,1


 
Johnmen ©   (2007-10-01 17:42) [1]

Копай в сторону кросс-таблиц и кросс-отчетов (cross).


 
Вася Правильный   (2007-10-01 17:44) [2]

запрос с неизвестным заранее числом колонок невозможен


 
Jeer ©   (2007-10-01 17:47) [3]

SELECT
(case when YEARS_ID = 2004 then YEARS_VAL else "0" end) as Y2004,
(case when YEARS_ID = 2005 then YEARS_VAL else "0" end) as Y2005,
(case when YEARS_ID = 2006 then YEARS_VAL else "0" end) as Y2006,
(case when YEARS_ID = 2007 then YEARS_VAL else "0" end) as Y2007
FROM YEARS;


 
Вася Правильный   (2007-10-01 17:50) [4]

Jeer ©   (01.10.07 17:47) [3]
отстается придумать опцию И.Т.Д., чтоб движок сам догадался, сколько колонок взять и по каким правилам


 
Draught   (2007-10-01 18:09) [5]

2Jeer ©  
Очень интересное решение, что-нибудь теперь точно придумаем.

2Вася Правильный
Движку будет передаваться SQL запрос, составленый исходя из количества строк :)

Думаю, что дальше я уже соображу как это организовать. Спасиб за помощь :)


 
sniknik ©   (2007-10-01 18:15) [6]

> отстается придумать опцию И.Т.Д., чтоб движок сам догадался, сколько колонок взять и по каким правилам
хелп аксесса
Инструкция TRANSFORM
Создает перекрестный запрос.

Синтаксис
TRANSFORM статФункция
   инструкцияSelect
   PIVOT поле [IN (значение_1[, значение_2[, ...]])]

Ниже перечислены аргументы инструкции TRANSFORM:
...


 
Вася Правильный   (2007-10-01 18:25) [7]


> sniknik ©   (01.10.07 18:15) [6]

мдя, не знал


 
b z   (2007-10-01 18:33) [8]


> хелп аксесса

смущает только autoincrement, Integer да и последний абзац топика, не ошибся ли автор при указании субд ...


 
Draught   (2007-10-01 18:43) [9]

2b z

Нет, не ошибся, поросто писал быстро, ну и ошибся, естественно Autonumber, Number.

А что касается последнего абзаца - я же все-таки в Delphi пишу, а не в самой MSAccess, а это просто SQL запрос в ADOQuery с использованием параметров.


 
sniknik ©   (2007-10-01 22:22) [10]

> я же все-таки в Delphi пишу, а не в самой MSAccess
но ты же пользуешься его движком, а тут уж "плевать в чем писать, а синтаксис запросов соблюдать обязан"

> а это просто SQL запрос в ADOQuery с использованием параметров.
тем более, с учетом сказанного для аксесса запрос - бред, и вдвойне бред изза того как используются параметры, раз это не мудренный синтаксис неизвестной субд.


 
Draught   (2007-10-02 10:44) [11]

2sniknik ©
Синтаксис запросов соблюдается, правильнее (удобнее) использолвать переменные (:FROM) при построении запроса, нежели (+INTTOSTR(FROM)) на то параметры и существуют, к тому же эти параметры конвертируются до этапа передачи запроса СУБД, так что для СУБД разницы тоже нет никакой. Или я может чего-то не понимаю? Тогда попрошу уточнить чего именно.

На счет бреда попрошу уточнить, ибо я считаю это просто банальным невежеством и неуважением к себе.

Я ошибся при указании типов данных, используемых в таблице, по большому счету разницы нет никакой INTEGER=NUMBER а AutoIncrement=AutoNumber.


 
sniknik ©   (2007-10-02 11:22) [12]

> правильнее (удобнее) использолвать переменные
с этим никто не спорит, но всетаки правильнее использовать параметры правильно, а не так, что ни движок тебя не поймет, ни ИИ, ни даже твои коллеги по ремеслу. (с чего и было предположение сначала, что движок какойто экзотический... но раз это не так то...)

> Тогда попрошу уточнить чего именно.
SELECT name as Name:From, Count as Count:From FROM table2
LIMIT :From,1
то что этот запрос не выполнится изза "непонимаемости" движком это не доказательство бредовости?
хочеш уточнений? тогда попробуй его выполнить и читай ошибки которые тебе будет выдавать вместо отработки.



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

Форум: "Базы";
Текущий архив: 2008.02.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.046 c
15-1200503850
Александр Иванов
2008-01-16 20:17
2008.02.17
Виртуальный SMTP сервер


2-1200997439
Gusev
2008-01-22 13:23
2008.02.17
Как реализовать "права пользователя" в своей программе? (БД)


2-1201139759
Maloj2007
2008-01-24 04:55
2008.02.17
Определение размера TStringList


2-1201253052
Bujhm
2008-01-25 12:24
2008.02.17
Свойство компонента


15-1200473403
barakuda
2008-01-16 11:50
2008.02.17
Орешник





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский