| 
 
 
 
 Легенда:
  новое сообщение 
  закрытая нитка 
  новое сообщение 
  в закрытой нитке 
  старое сообщение   | 
Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
Новичкам также крайне полезно ознакомиться с данным документом.
|  | Почему бы не :  23.10.10 01:31  Число просмотров: 4454 Автор: AMMOnium Статус: Незарегистрированный пользователь
 |  
| Почему бы не : --------------------------------
 select * from table1
 where not exists
 (
 select ':)' from table2
 where table2.id=table1.id
 -- ... и дофильтровать, если нужно --
 );
 --------------------------------
 или
 --------------------------------
 select * from table1
 minus
 (
 select * from table2
 -- и также дофильтровать, если нужно --
 -- where table2.id=table1.id, например --
 );
 --------------------------------
 
 Писал на оракле, но это, вроде бы, портабельная конструкция.
 |  | <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)
 ---
 |  
 
 
 |  |