Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Объеденить несколько строк из таблицы в отдну строку. [D7, Access]


Draught ©   (2007-10-01 17:11:00) 

День добрый.

Есть 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


sniknik   (2007-10-02 11:22:00) [1]

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

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


Draught   (2007-10-02 10:44:00) [2]

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

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

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


sniknik   (2007-10-01 22:22:00) [3]

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

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


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

2b z

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

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


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


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

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


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


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

мдя, не знал


sniknik   (2007-10-01 18:15:00) [7]

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

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

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


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

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

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

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


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

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


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

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:44:00) [11]

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


Johnmen   (2007-10-01 17:42:00) [12]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо