【问题标题】:How can I SELECT records using a select list made of foreign keys?如何使用由外键组成的选择列表来选择记录?
【发布时间】:2014-09-03 20:03:04
【问题描述】:

我有一个表 DEBTOR,其结构如下:

第二个表,DEBTOR.INFO 结构如下:

我有一个由 DEBTOR.INFO 表中的记录 ID 组成的选择列表。我该怎么办

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

这可能吗?

我意识到这个查询看起来更像 SQL 而不是 RetrieVe,但我这样写是为了更容易理解我想要完成的任务。

目前,我通过编写来完成这个查询

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

但显然这对于​​大型列表来说很不方便。

【问题讨论】:

    标签: universe unidata


    【解决方案1】:

    在我看来你不能这样做。即使您使用和 i-descriptor,它也只能在一个方向上起作用。 TRANS("DEBTOR.INFO",53,0,"X") 从 DEBTOR 文件工作,但不是相反。所以来自 DEBTOR.INFO 的 TRANS("DEBTOR",@ID,53,"X") 不会返回任何内容。

    请参阅此article on U2's site 以获得可能的解决方案。

    【讨论】:

    • 感谢您的回答。我意识到我在输入第二个查询时犯了一个错误,因此可能会改变正确的答案。另外值得一提的是,我需要与程序员合作才能将 i-descriptor 添加到字典中。 53 是 DEBTOR 表中的“外键”(PACKET),它与我从 DEBTOR.INFO 表中创建的选择列表中的记录 ID 匹配。
    • 我修改了我的答案,只显示带有 eval 方法的选择。如果您想避免与程序员合作,这可能是最简单的方法。
    • 我试过这个。不得不翻转单引号和双引号的位置。之后查询什么也没返回;似乎它试图从债务人表的 9 位 ID 索引中的 debor.info 选择列表中找到 8 位 ID,但未能成功。我添加了我的表结构图,以防出现一些混乱。
    • 我正在与我们的旧版应用程序团队合作尝试实施 LSELECT 计划。感谢您提请我注意这个潜在的解决方案。
    【解决方案2】:

    这样的工作是否可行(两个步骤):

    选择 DEBTOR.INFO 保存数据包 列出债务人 ....

    这会在 DEBTOR.INFO 文件的 PACKET 字段中创建一个数据选择列表并使其处于活动状态。 (如果您有重复的值,您可以在 SAVING 之后添加关键字 UNIQUE)。

    随后的 LIST 命令使用包含在文件 DEBTOR 的 @ID 字段中找到的值的活动选择列表。

    【讨论】:

    • 或者我读错了,你实际上可以使用 SQL for UniData 或 UniVerse 来做你想做的事。在 UniData 中,您需要 CONVERT.SQL 文件。然后像 SQL SELECT * FROM DEBTOR WHERE PACKET IN (SELECT ID FROM DEBTOR_INFO WHERE yourcriteria));
    • 不幸的是,我的选择列表不是从查询创建的,它是通过上传和转换一些任意数据包 ID 的 .csv 文件创建的。这就是为什么我想知道是否有某种方法可以在 SELECT 语句中使用列表的名称。
    • 没有,但您可以将该 .csv 文件保存到名为 MYLIST000 的 SAVEDLISTS 目录中,然后在下一个查询语句之前使用 GET.LIST MYLIST 将其激活。 (注意我没有在 GET.LIST 命令中使用 000。
    【解决方案3】:

    不确定您是否还在看这个,但有一个不需要大量编程的简单选项。

    我用一个程序、一个子例程和一个字典项来做到这一点。

    首先我设置一个命名的公共变量来包含 DEBTOR.INFO id 的列表:

    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
    

    【讨论】:

      【解决方案4】:

      我使用非常强大的 EVAL 和 XLATE ;

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

      【讨论】:

        猜你喜欢
        • 2019-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-25
        • 2023-01-03
        • 2020-02-13
        • 1970-01-01
        相关资源
        最近更新 更多