команда unidata запросит данные из двух файлов

У меня есть два файла в моей базе данных unidata, как показано ниже.

CUSTOMER

    -@CUSTOMERID
    -NAME
    -@HOBBYID (multi-valued, virtual attribute)

HOBBY

    -@HOBBYID
    -HOBBY

CUSTOMER и HOBBY являются отношениями "один ко многим". Я хочу запросить список клиентов, которые подходят к определенному хобби. Какой будет команда unidata?

С нетерпением ждем решения. Спасибо.


person Jia-Luo    schedule 06.08.2013    source источник
comment
Является ли здесь @CUSTOMERID многозначным; или как устроен файл «HOBBY», чтобы у вас было несколько клиентов для каждого хобби. Кроме того, это вопрос о драйвере UniJPA U2? Если это так, напишите по адресу [email protected], так как менеджер по продукту хотел бы поговорить с вами о том, как вы его используете. Спасибо!   -  person Dan McGrath    schedule 06.08.2013


Ответы (2)


Вот простой запрос, который вы можете запустить в командной строке ECL.

LIST HOBBY WITH HOBBY = "MyHobby" @CUSTOMERID @CUSTOMERID.NAME

Позвольте мне объяснить это.

Поскольку вы смотрите на отношение «многие к 1», вы можете сделать это, используя элементы виртуального словаря, если начнете с таблицы «многие» (я знаю, нелогично, верно?)

LIST HOBBY

Здесь мы просто поручаем движку сделать простое отображение данных из файла HOBBY.

WITH WITH HOBBY = "MyHobby"

Я исхожу из того, что вы уже создали элемент словаря с именем ХОББИ — вероятно, D-типа, указывающего на правильный атрибут.

@CUSTOMERID

Еще одно предположение: у вас есть элемент словаря D-типа, который указывает на атрибут в HOBBY, который имеет @CUSTOMERID. Я предполагаю, что @CUSTOMERID является единственным значением ради этого ответа. Это просто указывает LIST отображать эту часть информации для каждой записи.

@CUSTOMERID.NAME

Это словарь I-типа, который вам нужно будет создать, если вы еще этого не сделали. По сути, в атрибуте 2 элемента словаря у вас будет что-то вроде TRANS("CUSTOMER",@CUSTOMERID,2,"X"). Это говорит ему прочитать запись с идентификатором, найденным в @CUSTOMERID для текущей записи хобби, и вернуть вам атрибут 2 (я предполагаю, что атрибут 2 — это место, где вы храните имя клиента, изменяйте по желанию. «X» сообщает Функция TRANS просто возвращает пустую строку, если запись CUSTOMER не может быть найдена.

person Dan McGrath    schedule 06.08.2013
comment
Мне очень нравится стиль @filename, который вы использовали в своем примере. Я мог бы предложить структуру @filename.dictname как полезную для любого словаря типа TRANS. Мне нравятся @CUSTOMER.ID и @CUSTOMER.NAME за примеры, которые вы использовали выше. Это сразу дает понять, что это тип TRANS, из какого файла он обращается к данным и каков атрибут этого файла. - person Shawn McKnight; 07.08.2013

Дэн,

Я думаю, вы предположили больше, чем дано. Предоставленная информация не предполагает, что есть ссылки в обоих направлениях, только то, что коды хобби содержатся в файле CUSTOMER.

Учитывая предложенную информацию, это должно работать:

LIST CUSTOMER WITH @HOBBYID "MyHobby" NAME @HOBBYID

или, если вы хотите использовать HOBBY, а не @HOBBYID для сравнения/выбора:

LIST CUSTOMER WITH EVAL "TRANS(HOBBY,@HOBBYID,HOBBY,'X')" = "MyHobby" NAME @HOBBYID

Конечно, было бы еще лучше, если бы вы создали элемент словаря перевода в словаре CUSTOMER, который можно было бы использовать вместо использования предложения 'EVAL...'.

person rbl    schedule 07.08.2013
comment
Привет, rbl, Мой ответ был до их уточняющего редактирования. Если вы посмотрите на историю вопросов, вы увидите, что структура была немного другой, чем раньше. Обратите внимание, что спрашивающий предполагает, что @HOBBYID является многозначным, поэтому TRANS не будет работать для этого поля. Однако неясно, что подразумевается под «виртуальным атрибутом» в их конкретном случае, поэтому разъяснение этого может снова изменить ответ. - person Dan McGrath; 08.08.2013
comment
Эй, ребята, извините за неясный вопрос. Я использую драйвер u2jpa. Я хочу знать запрос, который, когда я ПОКАЗЫВАЮ КЛИЕНТА, может вернуть мне информацию о КЛИЕНТЕ (@CUSTOMERID, NAME, @HOBBYID, HOBBY). - person Jia-Luo; 08.08.2013
comment
@ Дэн МакГрат, без обид, я не вижу истории. Я использую юниверс, а не унидата, поэтому, возможно, TRANS работает там по-другому, но в юниверсе он отлично работает с многозначными полями. - person rbl; 12.08.2013