2012-03-13 2 views
0

я следующие таблицыOracle добавить результат от выбора до Resultset

Таблица 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, [email protected]_DBLINK NOD WHERE RES1.SITE_A = NOD.SITE_ID 
    )RES2, [email protected]_DBLINK NOD2 
WHERE RES2.SITE_B = NOD2.SITE_ID; 

До SELECT, RES1. *, Все работает отлично, но когда я добавляю ВЫБРАТЬ RES2. *, Он занимает слишком много времени, не возвращая ничего.

Надеюсь, вы можете мне помочь, заранее.

+0

почему подзапросы? почему бы просто не объединить ссылки с узлами в два раза? –

ответ

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 [email protected]_dblink node_a ON (links.site_a = node_a.site_id) 
INNER JOIN [email protected]_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 [email protected]_dblink node_a ON (links.site_a = node_a.site_id) 
INNER JOIN [email protected]_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: Если ваша ссылка DB является проблемой, пытаюсь вернуть только DAT вам понадобится по ссылке заранее, создав представление о удаленной БД или материализованное представление в локальной БД. Если это не практично, то проверить относительные объясняющие планы запроса выше против этого, и посмотреть, если это лучше:

WITH node_data 
    AS (SELECT site_id, 
      latitude, 
      longitude 
     FROM [email protected]_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; 
+0

Большое вам спасибо, я бы никогда не понял, никогда не знал, что двойное соединение может быть возможно. Теперь, когда я знаю, как это, кажется, просто. Еще раз спасибо!! –

+0

Не беспокойтесь, вы можете присоединиться к таблице (или представлению) столько раз, сколько необходимо, таблица может даже присоединиться к себе, если это необходимо. – Ollie

Смежные вопросы