Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | |
Причем это был Access 2003, который проглотил упомянутое условие. 10.01.11 23:15 Число просмотров: 4143
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
|
|
<programming>
|
SQL: Как получить разобъединение таблиц? 22.10.10 22:59
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
|
Извиняюсь за глупый вопрс, но не нашел по нему ответа. Наверняка плохо искал. У самого придумать не очень то и получается.
Допустим есть две таблицы по одному полю в каждой.
Задача: Как получить таблицу с записями из первой, которых нет во второй таблице?
Надеюсь корректно сформулировал. Если остаются вопросы - спрашивайте, поясню.
|
|
Left outer join where field is null 08.01.11 12:38
Автор: kstati <Евгений Борисов> Статус: Elderman Отредактировано 22.02.11 16:00 Количество правок: 8
|
В случае, если полей больше одного, имхо, отличное решение это outer join
t1 t2
id name id name
-- ---- -- ----
1 Pirate 1 Rutabaga
2 Monkey 2 Pirate
3 Ninja 3 Darth Vader
4 Spaghetti 4 Ninja ---
SELECT TableA.id, TableA.name
FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null
результат
2 Monkey
4 Spaghetti
Ну, а с таблицами, состоящими из одного поля тривиальных решений не вижу, кроме как подзапросы, уже отмеченые в этом топике
http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
Getting Joins
|
| |
О, тоже сработало. так даже красивее. не думал, что аксесс с этим справится. в смысле и left и outer одновременно. 09.01.11 18:14
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
|
|
| | |
Это обычный left join. Т.е. outer можно было и не писать. 10.01.11 07:19
Автор: Den <Денис Т.> Статус: The Elderman
|
Это обычный left join. Т.е. outer можно было и не писать.
Фокус в том, что access проглатил "where t2.id is null", чему лично я очень сильно удивился.
|
| | | |
Причем это был Access 2003, который проглотил упомянутое условие. 10.01.11 23:15
Автор: 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
|
|
| | | | | |
+1. Я тоже не знаю. 06.01.11 11:03
Автор: Fighter <Vladimir> Статус: Elderman
|
|
| | |
Concat не подходит? 30.12.10 02:50
Автор: Fighter <Vladimir> Статус: Elderman
|
|
| | | |
Не понял, это к чему? К разрывам при печати? Или к... 03.01.11 17:17
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
|
Не понял, это к чему? К разрывам при печати? Или к автонумерации? Конкатенция - это, вроде как, склеивание сродни операции UNION, который работает.
|
| | | | |
Это к "Ну и последний. ..." 04.01.11 03:52
Автор: Fighter <Vladimir> Статус: Elderman
|
|
|
с помощью union 23.10.10 18:11
Автор: Den <Денис Т.> Статус: The Elderman Отредактировано 23.10.10 18:32 Количество правок: 1
|
с помощью union
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)
---
|
|
|