【问题标题】:How to append result from select to resultset?如何将结果从选择附加到结果集?
【发布时间】:2012-03-13 10:59:06
【问题描述】:

我有以下表格:

  • 表 1 - 节点(我通过 DB_LINK 访问它):

    SITE_ID    LATITUDE    LONGITUDE
    ABC123     21.018      -89.711
    CDE456     20.35       -87.349
    FGH789     20.258      -87.406
    ABB987     18.54       -88.302
    CFF546     18.542      -88.273
    GHT553     18.52       -88.311
    
  • 表 2 - 链接

    ID   SITE_A    SITE_B   STATUS  NAME  LINK_TYPE REGION  ---> Many other fields
    1    ABC123    GHT553
    2    FGH789    CFF546     
    3    CDE456    ABC123        
    4    CFF546    GHT553     
    
  • 表 3 - 结果(这是我想要实现的) - 无论顺序如何

    LINK_ID   SITE_A_ID   LAT_SITE_A   LON_SITE_A   SITE_B_ID   LAT_SITE_B   LON_SITE_B
    1         ABC123      21.018       -89.711      GHT553      18.52        -88.311
    2         FGH789      20.258       -87.406      CFF546      18.542       -88.273
    3         CDE456      20.35        -87.349      ABC123      21.018       -89.711
    4         CFF546      18.542       -88.273      GHT553      18.52        -88.311
    

(加上其他几个字段,这对我来说没有问题)

这是我尝试过的:

SELECT RES2.*, SAM2.LATITUDE LAT_SITE_B, SAM2.LONGITUDE LON_SITE_B FROM(
    SELECT RES1.*, NOD.LATITUDE LAT_SITE_A, NOD.LONGITUDE LON_SITE_A FROM(
        SELECT ID, SITE_A, SITE_B, STATUS, NAME, LINK_TYPE FROM LINKS
            WHERE SITE_A IS NOT NULL AND SITE_B IS NOT NULL AND REGION IN (8,6)
         )RES1, NODES@NODES_DBLINK NOD WHERE RES1.SITE_A = NOD.SITE_ID
     )RES2, NODES@NODES_DBLINK NOD2 
WHERE RES2.SITE_B = NOD2.SITE_ID;

在SELECT RES1.\* 之前,一切正常,但是当我添加SELECT RES2.\* 时,需要很长时间才能返回任何内容。

【问题讨论】:

  • 为什么是子查询?为什么不直接将链接与节点连接两次?

标签: oracle select append resultset


【解决方案1】:

从您问题的文本部分,此查询将生成您想要的结果:

SELECT links.id AS link_id,
       node_a.site_id AS site_a_id,
       node_a.latitude AS lat_site_a,
       node_a.longitude AS lon_site_a,
       node_b.site_id AS site_b_id,
       node_b.latitude AS lat_site_b,
       node_b.longitude AS lon_site_b
  FROM links
 INNER JOIN nodes@nodes_dblink node_a ON (links.site_a = node_a.site_id)
 INNER JOIN nodes@nodes_dblink node_b ON (links.site_b = node_b.site_id)
 ORDER BY links.id;

从您发布的查询来看,您似乎还有一些其他条件要包括在内,这可能意味着您想要更像这样的东西:

SELECT links.id AS link_id,
       node_a.site_id AS site_a_id,
       node_a.latitude AS lat_site_a,
       node_a.longitude AS lon_site_a,
       node_b.site_id AS site_b_id,
       node_b.latitude AS lat_site_b,
       node_b.longitude AS lon_site_b
  FROM links
 INNER JOIN nodes@nodes_dblink node_a ON (links.site_a = node_a.site_id)
 INNER JOIN nodes@nodes_dblink node_b ON (links.site_b = node_b.site_id)
 WHERE links.site_a IS NOT NULL
   AND links.site_b IS NOT NULL
   AND links.region IN (8, 6)
 ORDER BY links.id;

希望对你有帮助...

编辑: 如果您的数据库链接有问题,请尝试通过在远程数据库上创建视图或在本地数据库上创建物化视图,提前通过链接返回您需要的数据。 如果这不切实际,请检查上述查询的相关解释计划,看看是否更好:

WITH node_data
  AS (SELECT site_id,
             latitude,
             longitude
        FROM nodes@nodes_dblink node
       WHERE EXISTS (SELECT 1
                       FROM links
                      WHERE links.site_a = node.site_id
                         OR links.site_b = node.site_id))
SELECT links.id AS link_id,
       node_a.site_id AS site_a_id,
       node_a.latitude AS lat_site_a,
       node_a.longitude AS lon_site_a,
       node_b.site_id AS site_b_id,
       node_b.latitude AS lat_site_b,
       node_b.longitude AS lon_site_b
  FROM links
 INNER JOIN node_data node_a ON (links.site_a = node_a.site_id)
 INNER JOIN node_data node_b ON (links.site_b = node_b.site_id)
 WHERE links.site_a IS NOT NULL
   AND links.site_b IS NOT NULL
   AND links.region IN (8, 6)
 ORDER BY links.id;

【讨论】:

  • 非常感谢,我永远也想不通,从不知道双重连接是可能的。现在我知道了,这似乎很简单。再次感谢!!
  • 不用担心,您可以根据需要多次加入表(或视图),如果需要,表甚至可以加入自身。
猜你喜欢
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
  • 2017-03-28
相关资源
最近更新 更多