информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Портрет посетителяГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Крупный взлом GoDaddy 
 Просроченный сертификат ломает... 
 Phrack #70/0x46 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Причем это был Access 2003, который проглотил упомянутое условие. 10.01.11 23:15  Число просмотров: 3155
Автор: 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-2021 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach