powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Вопрос нуба по запросу
13 сообщений из 13, страница 1 из 1
Вопрос нуба по запросу
    #37760568
fonarshik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В каше' нуб, поэтому сильно не пинайте. Вопрос: есть возможность через SQL-запрос сделать выборку из таблицы БД по полю где хранится коллекция (или ссылки на коллекцию я если честно не знаю, как правильно сказать) .
...
Рейтинг: 0 / 0
Вопрос нуба по запросу
    #37761297
fonarshik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл в конце предложения знак вопроса поставить.
...
Рейтинг: 0 / 0
Вопрос нуба по запросу
    #37761641
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fonarshik ,

Было .

Коллекции есть двух видов: списки, массивы.

Если у Вас массив, то используйте виртуальную таблицу: Основы Проецирования Объект-SQL
Если же список, то SQL-предикат FOR SOME %ELEMENT

Кроме того для ускорения запросов Вы можете коллекции проиндексировать: Индексация Коллекций
...
Рейтинг: 0 / 0
Вопрос нуба по запросу
    #37761805
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitКроме того для ускорения запросов Вы можете коллекции проиндексировать: Индексация Коллекций
А при выборке через SQL как эти индексы могут быть использованы?
...
Рейтинг: 0 / 0
Вопрос нуба по запросу
    #37761963
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я, было дело:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Class Example.Example %Extends %Persistent {

/// Список идентификаторов k, через запятую, для которых запрещены действия с объектом Example.Example
/// <example>2,114,321,23</example>
Property kban As %String(MAXLEN = 16384);

/// Не менять название, используется в коде <method>..kbanned</method>
/// Example.ExampleI("kban"," 2")=0101010001000100100100100100101010
/// Example.ExampleI("kban"," 23")=1111111111111111111111111111111111
/// Example.ExampleI("kban"," 114")=0000000000000010010010010010101000
/// Example.ExampleI("kban"," 321")=0000000000000010010010010010101000
Index kban On "kban(ELEMENTS)" [ Type = bitmap ];

/// Обязательный метод (версия Каше 5.1) для построения системой
/// хитро-ного индекса <index>kban</index>
/// Строится вызове через объекты  - d ..%Save()
/// Разбирает список значений в массив
ClassMethod kbanBuildValueArray(kban As %String, ByRef arr) As %Status {
	s list=$LFS(kban,","),key=0,k=""
	while $LISTNEXT(list,key,k){
		s:k'="" arr(k)=""
	}
 Q $$$OK
}

/// Проверка на наличие запрета
/// код для проверки значения битмапного индекса
ClassMethod kbanned(id, k) As %Boolean [ SqlProc ] {
        s part=id\64000+1 ;подиндекс в зависимости от кол-ва ид в классе
	s offset=id#64000+1 ;смещение от начала строки
        #; " "_k - нужно, так как значения строковые
	Q $bit($g(^Example.ExampleI("kban"," "_k,part)),offset)  
}
}


Использование, например:
Код: sql
1.
 Select * From Example.Example Where Example.Example_kbanned(ID,2)=1
...
Рейтинг: 0 / 0
Вопрос нуба по запросу
    #37762161
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefintИспользование, например:
Код: sql
1.
 Select * From Example.Example Where Example.Example_kbanned(ID,2)=1


Дык тут чтобы встать на ID оно же все ID должно перебрать. Вот если бы эта рукопашная SqlProc вернула сам ID, тогда еще ниче так.
...
Рейтинг: 0 / 0
Вопрос нуба по запросу
    #37762270
fonarshik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servit fonarshik ,

Было .

Коллекции есть двух видов: списки, массивы.

Если у Вас массив, то используйте виртуальную таблицу: Основы Проецирования Объект-SQL
Если же список, то SQL-предикат FOR SOME %ELEMENT

Кроме того для ускорения запросов Вы можете коллекции проиндексировать: Индексация Коллекций

У меня коллекция список объектов(которые занесены в другую таблицу), сейчас пример приведу:
Есть 2 класса Salers и Prodacts

/// Торгаши
Class OModel.Salers Extends %Persistent
{
/// ФИО
Property Name As %String;;
/// Рег.данные
Property Reg As %String;
/// Адрес
Property Address As Address;
/// Товары
Property Product As list Of Product;
}


/// Товары
Class OModel.Prodacts Extends %Persistent
{
/// Артикул
Property Artikul As %Integer;
/// Описание товара
Property Opisanie As %String;
}

Мне нужно выбрать продавцов у которых имеется заданный товар(например по артикулу). Это возможно сделать?
...
Рейтинг: 0 / 0
Вопрос нуба по запросу
    #37762527
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну яservitКроме того для ускорения запросов Вы можете коллекции проиндексировать: Индексация Коллекций А при выборке через SQL как эти индексы могут быть использованы? SELECT Name,FavoriteColors FROM Sample.Person WHERE FOR SOME %ELEMENT(FavoriteColors) (%VALUE='Red')

План запроса без индекса:

Код: plaintext
1.
2.
3.
4.
5.
Относительная стоимость = 169400 
Read master map Sample.Person.IDKEY, looping on ID.

For each row:

 Output the row.


План запроса с индексом Index fcIDX1 On FavoriteColors(ELEMENTS); :

Код: plaintext
1.
2.
3.
4.
5.
6.
Относительная стоимость = 1644 
Read index map Sample.Person.fcIDX1, using the given %SQLUPPER(Subvalue(FavoriteColors)), and looping on ID.

For each row:

 Read master map Sample.Person.IDKEY, using the given idkey value. 
 Output the row.

Разница в количестве глобальных ссылок (соответственно возрастание скорости выполнения) будет особо ощутима на б о льшем количестве данных.

По поводу примера doublefint .
Хоть это и не коллекция в чистом виде, тем не менее оптимизатор может ускорить запрос и для таких данных.
Например:Class test.C Extends %Persistent
{

Index f1 On f1(ELEMENTS) [ Type = bitmap ];

Property f1 As %String;

ClassMethod f1BuildValueArray(
  serialized As %Binary,
  array As %Binary) As %Status
{
  s list=$LFS(serialized,","),ptr=0,item=""
  while $LISTNEXT(list,ptr,item){
    s:item'="" array(ptr)=item
  }
 Q $$$OK
}

ClassMethod Fill()
{
  d ..%KillExtent()
  s ^test.CD(1)=$lb("","")  
  s ^test.CD(2)=$lb("","1")  
  s ^test.CD(3)=$lb("","2,1")  
  s ^test.CD(4)=$lb("","2,2")  
  s ^test.CD(5)=$lb("","1,2,3")  
  s ^test.CD=5
  do ..%BuildIndices(,1,1)
  
  do $system.SQL.TuneTable("test.C",1,1)

}

}
Найти все записи, в строке(списке) f1 которых есть элементы 1 и/или 3:
select * from test.C where for some %element(f1) (%value in (1,3))

Можно то же сделать, работая с f1 как обычной строкой, но это будет менее эффективно.
...
Рейтинг: 0 / 0
Вопрос нуба по запросу
    #37762541
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fonarshikМне нужно выбрать продавцов у которых имеется заданный товар(например по артикулу). Это возможно сделать?
Можно:Class SqlRu.Prodacts Extends %Persistent
{

/// Артикул
Property Artikul As %Integer;

/// Описание товара
Property Opisanie As %String;

}

Class SqlRu.Salers Extends %Persistent
{

/// ФИО
Property Name As %String;

/// Рег.данные
Property Reg As %String;

/// Товары
Property Product As list Of Prodacts;

ClassMethod Fill()
{
  ;d ##class(SqlRu.Salers).Fill()
  do ##class(SqlRu.Salers).%KillExtent()
  do ##class(SqlRu.Prodacts).%KillExtent()
  
  &sql(insert into SqlRu.Prodacts(Artikul,Opisanie) 
          select 2,'Opisanie2' union
          select 4,'Opisanie4' union
          select 1,'Opisanie1')
  &sql(insert into SqlRu.Salers(Name,Reg,Product) 
          select 'Name1','Reg1',$listbuild($listbuild(trim('1')),$listbuild(trim('3'))) union
          select 'Name2','Reg2',$listbuild($listbuild(trim('3')),$listbuild(trim('2'))) union
          select 'Name3','Reg3',$listbuild($listbuild(trim('1'))))

  do ##class(SqlRu.Prodacts).%BuildIndices(,1,1)
  do ##class(SqlRu.Salers).%BuildIndices(,1,1)
  
  do $system.SQL.TuneTable("SqlRu.Prodacts",1,1)
  do $system.SQL.TuneTable("SqlRu.Salers",1,1)
}

}
Найти всех продавцов, продавших товар с артикулом 2 и/или 4:
select * from SqlRu.Salers where for some %element(product) (+$listget(%value) in (select %ID from SqlRu.Prodacts where Artikul in (2,4)))

PS: в Вашем случае вместо коллекции объектов лучше использовать отношение типа один-ко-многим или родитель-потомки .
...
Рейтинг: 0 / 0
Вопрос нуба по запросу
    #37762597
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
круто, хорошее дополнение к доке
...
Рейтинг: 0 / 0
Вопрос нуба по запросу
    #37762654
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
doublefint
Код: sql
1.
/// хитро-ного индекса <index>kban</index>

Хитронный индекс?
+1
...
Рейтинг: 0 / 0
Вопрос нуба по запросу
    #37762693
fonarshik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servit,

Спасибо, буду пробовать.
...
Рейтинг: 0 / 0
Вопрос нуба по запросу
    #37763038
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit, хитронный, да :D
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Вопрос нуба по запросу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]