从表中选择值,其中名称存储在另一个表中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从表中选择值,其中名称存储在另一个表中相关的知识,希望对你有一定的参考价值。

我有下面的视图,它使用get_rationalized_ip_adr函数来检索从NODE表作为输入nodeid给出的一些值。

    CREATE OR REPLACE VIEW A_DEVICE AS
    SELECT  NODE.NAME AS DEVICE
          , NODETYPE.TABLENAME AS TABLENAME
          , ext_a_device.get_rationalized_ip_adr(NODE.NODEID) AS IPADDRESS
          , COALESCE(LOC_SITE.OS_EASTING, LOC_RAILWAY.OS_EASTING, LOC_SIGNALBOX.EASTING) AS OS_EASTING
          , COALESCE(LOC_SITE.OS_NORTHING, LOC_RAILWAY.OS_NORTHING, LOC_SIGNALBOX.NORTHING) AS OS_NORTHING
    FROM NODE NODE
    JOIN NODETYPE NODETYPE
    ON NODE.NODE2NODETYPE = NODETYPE.NODETYPEID;

我必须在select stmt中添加该函数,以便获取存在于其他一些表中的ipaddresses,这些表的名称存储在NODETYPE表中。

例如,这是屏幕截图形式的节点类型表。所以get_rationalized_ip_adr调用一个API,它从NR_NODE_DDF获取传递给它的每个nodeid。

enter image description here

get_rationalized_ip_adr函数只使用nodeid输入调用API并返回相应节点的ip_adr。

FUNCTION get_rationalized_ip_adr( pin_node_id IN NUMBER)

RETURN VARCHAR2 IS
ln_errorcode NUMBER;
ls_errortext VARCHAR2(200);
ls_result    VARCHAR2(200);
BEGIN
    pkggeneral.getobjectattribute( o_errorcode => ln_errorcode
                                        , o_errortext => ls_errortext
                                        , i_dimobject => pkgdimensionconstants.dimensionObject_Node
                                        , i_objectid  => pin_node_id
                                        , i_attribute => 'IP_ADDRESS'
                                        , o_result    => ls_result);
    RETURN ls_result;
END get_rationalized_ip_adr;

现在问题就是这个select语句需要大约90秒,这太过分了。

SELECT * FROM A_DEVICE ad where ad.ipaddress = '10.16.52.152'

据我所知,在sql和pl-sql上下文之间切换是这次运行的问题。

谁能想到另一种解决方案来减少这个时间?

答案

您需要使用存储IP地址的表替换函数调用。

CREATE OR REPLACE VIEW A_DEVICE AS
    SELECT  NODE.NAME AS DEVICE
          , NODETYPE.TABLENAME AS TABLENAME
          , t.IPADDRESS
          , COALESCE(LOC_SITE.OS_EASTING, LOC_RAILWAY.OS_EASTING, LOC_SIGNALBOX.EASTING) AS OS_EASTING
          , COALESCE(LOC_SITE.OS_NORTHING, LOC_RAILWAY.OS_NORTHING, LOC_SIGNALBOX.NORTHING) AS OS_NORTHING
    FROM NODE NODE
    JOIN NODETYPE NODETYPE
         ON NODE.NODE2NODETYPE = NODETYPE.NODETYPEID
    join table_with_ip_address t
         on ...;

此外,请确保在用于连接的字段上具有必需的索引。

以上是关于从表中选择值,其中名称存储在另一个表中的主要内容,如果未能解决你的问题,请参考以下文章

从表中选择行,其中具有相同 id 的另一个表中的行在另一列中具有特定值

如何加入名称作为值存储在另一个表中的表?

从表中删除记录,如果其特定值未出现在另一个表中

SQL 查询 SELECT FROM [从表名中选择值]

从表中选择数据并从另一个表中填充特定值

使用 select from 从表中获取值以存储在插入表中