Форум: "Базы";
Текущий архив: 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.47 MB
Время: 0.045 c