Как добавить результат из выбора в набор результатов? - PullRequest
0 голосов
/ 13 марта 2012

У меня есть следующие таблицы:

  • Таблица 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.\*, это занимает слишком много времени, ничего не возвращая.

1 Ответ

1 голос
/ 13 марта 2012

Исходя из текстовой части вашего вопроса, этот запрос сгенерирует желаемый результат:

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;

Надеюсь, это поможет ...

EDIT: Если ваша ссылка на БД представляет собой проблему, попробуйте вернуть по ссылке только те данные, которые вам нужны, заранее, создав представление удаленной БД или материализованное представление локальной БД. Если это нецелесообразно, тогда сравните относительные планы объяснения для вышеупомянутого запроса с этим и посмотрите, лучше ли это

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...