информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяСетевые кракеры и правда о деле ЛевинаГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
О, тоже сработало. так даже красивее. не думал, что аксесс с этим справится. в смысле и left и outer одновременно. 09.01.11 18:14  Число просмотров: 4066
Автор: 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 <Denis> Статус: 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 <Denis> Статус: 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 <Denis> Статус: 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 <Denis> Статус: 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)

---
1  |  2 >>  »  




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach