Как я могу ВЫБРАТЬ записи, используя список выбора, состоящий из внешних ключей?

У меня есть таблица ДОЛЖНИК с такой структурой:

ДОЛЖНИК

и вторая таблица, DEBTOR.INFO, имеющая следующую структуру:

DEBTOR.INFO

У меня есть список выбора, состоящий из идентификаторов записей из таблицы DEBTOR.INFO. Как я могу

select * from DEBTOR WHERE 53 IN (name of select list)?

Это вообще возможно?

Я понимаю, что этот запрос больше похож на SQL, чем на RetrieVe, но я написал его таким образом, чтобы было проще понять, чего я пытаюсь достичь.

В настоящее время я выполняю этот запрос, написав

SELECT DEBTOR WITH 53 EQ [paste list of DEBTOR.INFO record IDs]

но очевидно, что это громоздко для больших списков.


person user3140622    schedule 03.09.2014    source источник


Ответы (4)


Мне кажется, что вы не можете этого сделать. Даже если вы используете и i-дескриптор, он работает только в одном направлении. TRANS("DEBTOR.INFO",53,0,"X") работает с файлом DEBTOR, но не наоборот. Таким образом, TRANS("DEBTOR",@ID,53,"X") из DEBTOR.INFO ничего не вернет.

См. эту статью на сайте U2 для возможного решения.

person Lamb Of Zod    schedule 04.09.2014
comment
Спасибо за Ваш ответ. Я понял, что допустил ошибку, набрав свой второй запрос, так что, вероятно, изменит правильный ответ. Также стоит упомянуть, что мне нужно будет объединиться с программистами, чтобы добавить i-дескриптор в словарь. 53 — это внешний ключ (PACKET) в таблице DEBTOR, который соответствует идентификатору записи в моем списке выбора, сделанном из таблицы DEBTOR.INFO. - person user3140622; 04.09.2014
comment
Я изменил свой ответ, чтобы показать выбор только с подходом eval. Это может быть самый простой способ, если вы хотите избежать совместной работы с программистами. - person Lamb Of Zod; 06.09.2014
comment
Я попробовал это. Пришлось поменять местами одинарные и двойные кавычки. После этого запрос ничего не вернул; похоже, что он пытался и не смог найти 8-значные идентификаторы из списка выбора Debor.info в индексе 9-значных идентификаторов из таблицы должников. Я добавил схему структуры моей таблицы на случай, если возникнет путаница. - person user3140622; 08.09.2014
comment
Я работаю с нашей командой по устаревшим приложениям, чтобы попытаться внедрить программу LSELECT. Спасибо, что обратили мое внимание на это потенциальное решение. - person user3140622; 05.01.2015

Будет ли что-то вроде этой работы (два шага):

SELECT DEBTOR.INFO СОХРАНЕНИЕ СПИСКА ПАКЕТОВ ДОЛЖНИК ....

Это создает список выбора данных в поле PACKET в файле DEBTOR.INFO и делает его активным. (Если у вас есть повторяющиеся значения, вы можете добавить ключевое слово UNIQUE после SAVING).

Затем следующая команда LIST использует этот активный список выбора, который содержит значения, найденные в поле @ID файла DEBTOR.

person jbmonco    schedule 04.09.2014
comment
Или, может быть, я неправильно читаю, и вы действительно можете использовать SQL для UniData или UniVerse, чтобы делать то, что хотите. В UniData вам нужно CONVERT.SQL файл(ы). Затем что-то вроде SQL SELECT * FROM DEBTOR WHERE PACKET IN (SELECT ID FROM DEBTOR_INFO WHERE yourcriteria)); - person jbmonco; 04.09.2014
comment
К сожалению, мой список выбора не создается из запроса, он создается путем загрузки и преобразования файла .csv некоторых произвольных идентификаторов пакетов. Вот почему мне интересно, есть ли способ использовать имя списка в инструкции SELECT. - person user3140622; 05.09.2014
comment
Нет, но вы можете сохранить этот файл .csv в каталоге SAVEDLISTS под именем MYLIST000, а затем использовать GET.LIST MYLIST, чтобы активировать его перед следующим оператором запроса. (обратите внимание, я не использую 000 в команде GET.LIST. - person jbmonco; 17.09.2014

Не уверен, что вы все еще смотрите на это, но есть простой вариант, который не потребует много программирования.

Я сделал это с помощью программы, подпрограммы и элемента словаря.

Сначала я установил именованную общую переменную, чтобы она содержала список идентификаторов DEBTOR.INFO:

SETLIST
*
* Use named common to hold list of keys
COMMON /MYKEYS/ KEYLIST
*
* Note for this example I am reading the list from SAVEDLISTS
OPEN "SAVEDLISTS" TO FILE ELSE STOP "CAN NOT OPEN SAVEDLISTS"
READ KEYLIST FROM FILE, "MIKE000" ELSE STOP "NO MIKE000 ITEM"

Теперь я могу создать подпрограмму, которая проверяет значение в этом списке.

CHECKLIST
SUBROUTINE CHECKLIST( RVAL, IVAL)
COMMON /MYKEYS/ KEYLIST
LOCATE IVAL IN KEYLIST <1> SETTING POS THEN
  RVAL = 1
END ELSE RVAL = 0
RETURN

Наконец, я использую элемент словаря для вызова подпрограммы с полем, которое я ищу:

INLIST:
I
SUBR("CHECKLIST", FK)

IN LIST
10R
S

Теперь все, что мне нужно сделать, это указать правильные критерии в моем утверждении списка:

LIST DEBTOR WITH INLIST = 1 ACCOUNT STATUS FK
person Mike    schedule 10.09.2014

Я бы использовал очень мощный EVAL с XLATE;

SELECT DEBTOR WITH EVAL \XLATE('DEBTOR.INFO',@RECORD<53>,'-1','X')\ NE ""
person Roga    schedule 07.11.2014