Полное объединение и объединение двух таблиц с несколькими ключами - PullRequest
0 голосов
/ 31 октября 2011

Мне нужно полностью объединить две таблицы с несколькими ключами

Например, у меня есть две таблицы, одна выглядит так:

id1 | foreignerkey | name | value
 1         5         name1    1
 2         6         name2    2
 3         7         name4    3

как t01;другой выглядит так:

id2 | foreignerkey | name | value
 1         5         name1  1
 2         7         name2  2
 3         8         name2  3

как t02.

Мне нужно "select t01.* , to2.* from t01 full join t02 on t01.name = t02.name", но мне также нужно "select t01.* , t02.* from t01 join t02 where t01.foreignerkey = t02.foreignerkey", результат, который мне нужен, такой:

 id1 | foreignerkey | name | value | id2 | foreignerkey | name | value
  1         5         name1    1      1         5         name1    1
  2         6         name2    2     null     null        null    null
  3         7         name4    3     null     null        null    null
 null     null        null    null    2         7         name2    2
 null     null        null    null    3         8         name2    3

Проблема в том, что, как вы можете видеть, я сначала поставил строку запроса примерно так: "select t01.* , t02.* from t01 full join t02 on t01.name = t02.name where t01.foreignerkey = t02.foreignerkey", но затем, когда t01.name = "name4" (чего нет в t02), он не будет отображаться в результатах.

Итак, моя последняя строка запроса:

select a.* from
    (select t01.id1, t01.foreignerkey as foreignerkey1, t01.name, t01.value,
            t02.id2, t02.foreignerkey as foreignerkey2, t02.name, t02.value 
    from t01 
    full join t02 
    on t01.name = t02.name) a
where a.foreignerkey1 = a.foreignerkey2 
      or a.foreignerkey1 is null 
      or a.foreignerkey2 is null

Получение результатов слишком дорого, есть ли лучшее решение?

Ответы [ 4 ]

1 голос
/ 31 октября 2011

Не понимаю, зачем вам внутренний запрос

select t01.id1,t01.foreignerkey as foreignerkey1,t01.name,t01.value,
    t02.id2,t02.foreignerkey as foreignerkey2,t02.name,t02.value 
from t01 
full outer join t02 on a.foreignerkey1=a.foreignerkey2 AND t01.name = t02.name
1 голос
/ 31 октября 2011

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

SELECT *
  FROM t01, t02
 WHERE t01.NAME = t02.NAME
   AND t01.foreignerkey = t02.foreignerkey
UNION ALL
SELECT t01.*, NULL, NULL, '', ''
  FROM t01
 WHERE NOT EXISTS (SELECT NULL
          FROM t02
         WHERE t01.NAME = t02.NAME
           AND t01.foreignerkey = t02.foreignerkey)
UNION ALL
SELECT NULL, NULL, '', '', t02.*
  FROM t02
 WHERE NOT EXISTS (SELECT NULL
          FROM t01
         WHERE t01.NAME = t02.NAME
           AND t01.foreignerkey = t02.foreignerkey)
  • Использовать внутреннее соединение с t01.NAME = t02.NAME AND t01.foreignerkey = t02.foreignerkey
  • Используйте NOT EXISTS, чтобы получить записи из t01, которые не совпадают в t01
  • Используйте NOT EXISTS, чтобы получить записи из t02, которые не совпадают в t01
  • Используйте UNION для объединения наборов результатов, в этом случае ВСЕ безопасно, поскольку мы знаем, что три набора результатов являются взаимоисключающими

Или вы можете использовать внешнее объединение, как @kedar kamthe предложил:

SELECT *
  FROM t01, t02
 WHERE t01.NAME = t02.NAME(+)
   AND t01.foreignerkey = t02.foreignerkey(+)
UNION
SELECT NULL, NULL, '', '', t02.*
  FROM t02
 WHERE NOT EXISTS (SELECT NULL FROM t01 WHERE t01.NAME = t02.NAME  AND  t01.foreignerkey = t02.foreignerkey)

Но вам все еще нужен второй запрос, чтобы вернуть результаты из t02

0 голосов
/ 20 апреля 2018

Я создал объединенное поле из нескольких ключей и использовал полное внешнее соединение, sql, как показано ниже. Я не знаю, подходит ли оно вашему делу, но решило мое дело

select * from 
(select *, foreignerkey || name as mk from t01) tt1
full outer join
(select *, foreignerkey || name as mk from t02) tt2 on tt1.mk = tt2.mk
0 голосов
/ 31 октября 2011

Вы можете просто использовать " Внешнее соединение ", в этом случае на иностранный ключ и имя столбцы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...