Не очень то хотелось связываться. Тяжелее потом...09.01.11 18:26 Число просмотров: 3940 Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman Отредактировано 09.01.11 18:57 Количество правок: 1
> В твоем случае спасет только VBA. В полученном RecordSet'e
Не очень то хотелось связываться. Тяжелее потом сопровождать. Да и к тому же получается, что для простой операции придется такой огород городить.
Скорее нужно будет переделывать ТЗ.
Я просто думал, что есть возможность использовать свою маленькую, самописную функцию, типа статичтических avg/sum/max, которой на вход подается RecordSet целевых данных.
Ну нет, так нет.
> запроса надо включить сортировку field1, field2 и > обрабатывая каждую запись, создать временную таблицу с > правильно сформированными данными. На основе этой таблицы > можно построить отчет. > > P.S. Вообще, твой пример сильно противоречит нормализации > реляционных БД.
Собственно, достаточно было бы не для базы, а для постоения отчета.
Да и ничего такого страшно противоречащего не вижу. Есть табличка связей объектов и их свойств. Нужно В ОТЧЕТЕ получить список объектов и перечисление их свойств по таблице связей.
Ну нет, так нет.
Извиняюсь за глупый вопрс, но не нашел по нему ответа. Наверняка плохо искал. У самого придумать не очень то и получается.
Допустим есть две таблицы по одному полю в каждой.
Задача: Как получить таблицу с записями из первой, которых нет во второй таблице?
Надеюсь корректно сформулировал. Если остаются вопросы - спрашивайте, поясню.
Left outer join where field is null08.01.11 12:38 Автор: kstati <Евгений Борисов> Статус: Elderman Отредактировано 22.02.11 16:00 Количество правок: 8
О, тоже сработало. так даже красивее. не думал, что аксесс с этим справится. в смысле и left и outer одновременно.09.01.11 18:14 Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
SQL прекрасно работает со множествами и определением принадлежности элемента ко множеству.28.10.10 12:03 Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 28.10.10 12:05 Количество правок: 1
> Допустим есть две таблицы по одному полю в каждой. > Задача: Как получить таблицу с записями из первой, которых > нет во второй таблице? SELECT * FROM table1
WHERE firstField.table1 NOT IN (SELECT firstField FROM table2)
Очень вовремя вы это дело обсудили ) Спасибо обоим )26.12.10 04:21 Автор: Fighter <Vladimir> Статус: Elderman
[Есть обновления и дополнения] Спасибо, "not in" сработало, а "not exist" и "minus" не...21.12.10 23:51 Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman Отредактировано 29.12.10 23:31 Количество правок: 8
Один баг перерос в другой (касаемо "резиновых" отчетов). Аксес рвет текстовые строчки. Может, кто сталкивался, подскажет как обойти. Верхняя половина строки остается в конце листа, а нижняя переносится на новую страницу! Это явный баг, такого быть не должно. Более чем уверен, что если отчет не будет растягиваться, то такого эффекта добится будет невозможно. Вопрос - что можно сделать, чтобы обойти разрыв?
Вопрос про автонумерацию остается актуальным.
> > Допустим есть две таблицы по одному полю в каждой. > > Задача: Как получить таблицу с записями из первой, > которых > > нет во второй таблице? > SELECT * FROM table1 > WHERE firstField.table1 NOT IN (SELECT firstField FROM > table2)
Спасибо, "not in" сработало, а "not exist" и "minus" не воспринял.
Есть еще немножко вопросиков.
Самый простой. Есть большая таблица "сборник инфы". Из нее строятся отчеты на основе хитрых запросов. Как бы сделать так, чтобы строки в отчете были пронумерованы?
================================================================================================
Еще вопросик. Есть хитрый отчет с "резиновыми полями", который очень любит не помешаться на страницу, когда поля очень сильно растягиваются. Если растягивать отчет вручную, то получаются пустые страницы. Как бы сделать так, чтоб отчет сам растягивался и сам переносился на следующую страницу, кода это необходимо.
----------------
Эта проблема, похоже, решилась. Сам не понял, что это был за баг. Вроде как неудачное сочетание размеров отчета, полей, размеров бумаги, области данных, перевода страницы и прочего.
================================================================================================
Ну и последний. Он не столь актуальный, но хочется овладеть технологией. Есть таблица. В ней, допустим, два текстовых поля. Хочется чтобы при группировке данных по первому полю, вторые поля конкатировались (текст склеивался/дозаписывался) бы через запятую.
Все это для Аксеса 2010 и хотелось бы без особых наворотов, попереносимее, понятнее, прозрачнее, проще...
Оператор "+" в ANSI SQL должен конкатенировать строковые аргументы.05.01.11 10:07 Автор: HandleX <Александр М.> Статус: The Elderman Отредактировано 05.01.11 10:10 Количество правок: 1
> Ну и последний. Он не столь актуальный, но хочется овладеть > технологией. Есть таблица. В ней, допустим, два текстовых > поля. Хочется чтобы при группировке данных по первому полю, > вторые поля конкатировались (текст > склеивался/дозаписывался) бы через запятую. > Все это для Аксеса 2010 и хотелось бы без особых наворотов, > попереносимее, понятнее, прозрачнее, проще...
Ну типа пример для констант:
SELECT ('a' + 'b' + 'c'), ('de' + 'fgh')
Скобки поставил для наглядности, можно без них.
Для текстовых полей "с дозаписью через запятую", бгг ;)
SELECT textField1 + ', ' + textField2 FROM table1
И Fighter'у тоже: что через "+", что через "concat" можно...05.01.11 21:10 Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
И Fighter'у тоже: что через "+", что через "concat" можно объединить поля, но как объединить не поля, а значения одного и того же поля при группировке. Например:
есть табличка
field1, field2
"flower", "rose"
"flower", "camomile"
"flower", "cactus"
нужно получить в результате объединения по первому полю
"flower", "rose, camomile, cactus"
какую статистическую или самонаписанную функцию нужно применить ко второму полю?
Это нужно для получения сводной таблички отчета, где в первой колонке будет столбец субъектов, а во второй - список ресурсов, им распределенных.
> > Ну и последний. Он не столь актуальный, но хочется > овладеть > > технологией. Есть таблица. В ней, допустим, два > текстовых > > поля. Хочется чтобы при группировке данных по первому > полю, > > вторые поля конкатировались (текст > > склеивался/дозаписывался) бы через запятую. > > Все это для Аксеса 2010 и хотелось бы без особых > наворотов, > > попереносимее, понятнее, прозрачнее, проще... > > Ну типа пример для констант: > SELECT ('a' + 'b' + 'c'), ('de' + 'fgh') > Скобки поставил для наглядности, можно без них. > > Для текстовых полей "с дозаписью через запятую", бгг ;) > SELECT textField1 + ', ' + textField2 FROM table1
Никак. [upd]07.01.11 20:39 Автор: Den <Денис Т.> Статус: The Elderman Отредактировано 07.01.11 20:50 Количество правок: 2
Группировка на SQL сервере работает по полям. Многие SQL серверы не поддерживают даже индексацию по выражениям, построенным на полях.
При подобных задачах, ИМХО, самое эффективное - использовать FoxPro
> Например: > есть табличка > field1, field2 > "flower", "rose" > "flower", "camomile" > "flower", "cactus" > нужно получить в результате объединения > по первому полю "flower", "rose, camomile, cactus"
В твоем случае спасет только VBA. В полученном RecordSet'e запроса надо включить сортировку field1, field2 и обрабатывая каждую запись, создать временную таблицу с правильно сформированными данными. На основе этой таблицы можно построить отчет.
P.S. Вообще, твой пример сильно противоречит нормализации реляционных БД.
Не очень то хотелось связываться. Тяжелее потом...09.01.11 18:26 Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman Отредактировано 09.01.11 18:57 Количество правок: 1
> В твоем случае спасет только VBA. В полученном RecordSet'e
Не очень то хотелось связываться. Тяжелее потом сопровождать. Да и к тому же получается, что для простой операции придется такой огород городить.
Скорее нужно будет переделывать ТЗ.
Я просто думал, что есть возможность использовать свою маленькую, самописную функцию, типа статичтических avg/sum/max, которой на вход подается RecordSet целевых данных.
Ну нет, так нет.
> запроса надо включить сортировку field1, field2 и > обрабатывая каждую запись, создать временную таблицу с > правильно сформированными данными. На основе этой таблицы > можно построить отчет. > > P.S. Вообще, твой пример сильно противоречит нормализации > реляционных БД.
Собственно, достаточно было бы не для базы, а для постоения отчета.
Да и ничего такого страшно противоречащего не вижу. Есть табличка связей объектов и их свойств. Нужно В ОТЧЕТЕ получить список объектов и перечисление их свойств по таблице связей.
Ну нет, так нет.
В минимальной нормализации, должно быть что-то типа:10.01.11 07:13 Автор: Den <Денис Т.> Статус: The Elderman
> Собственно, достаточно было бы не для базы, а для постоения > отчета. > Да и ничего такого страшно противоречащего не вижу. Есть > табличка связей объектов и их свойств. Нужно В ОТЧЕТЕ > получить список объектов и перечисление их свойств по > таблице связей. > Ну нет, так нет.
В минимальной нормализации, должно быть что-то типа:
create table obj_class (
class_id int identity(1,1),
class_name varchar(64) not null,
constraint obj_class_pk primary key clustered (class_id),
constraint obj_class_uq unique (class_name)
)
create table obj_prop (
class_id int not null,
prop_name varchar(64) not null,
constraint obj_prop_fk_obj_class foreign key (class_id) references obj_class (class_id)
)
---
к которым будет строиться следующий запрос:
select a.class_id, a.class_name, b.prop_name
from obj_class a
inner join obj_prop b on b.class_id = a.class.id
---
Ну да, типа того, только там еще дополнительно всякая ерунда. Все равно без VBA список значений через запятую не получить.10.01.11 23:21 Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
Средствами чистого SQL то, что ты просишь невозможно... А в Access VBA я не силён, сорри. Смени подход, организуй отчёт по-другому.05.01.11 23:08 Автор: HandleX <Александр М.> Статус: The Elderman
select table1.field1
from table1
where table1.field1 not in (select table2.field2 from table2)
union
select table2.field1
from table2
where table2.field1 not in (select table1.field2 from table1)