Вопрос присоединения к SQL - PullRequest
0 голосов
/ 03 июля 2018

У меня есть две разные таблицы, но обе таблицы могут иметь или не иметь одинаковые записи. мне нужно присоединиться к этим таблицам и получить все разные записи для обеих таблиц

например

CREATE TABLE sql_test_a 
( 
    ID         VARCHAR2(4000 BYTE), 
    FIRST_NAME VARCHAR2(200 BYTE), 
    LAST_NAME  VARCHAR2(200 BYTE) 
); 

CREATE TABLE sql_test_b 
( 
    ID         VARCHAR2(4000 BYTE), 
    FIRST_NAME VARCHAR2(200 BYTE), 
    LAST_NAME  VARCHAR2(200 BYTE) 
); 

INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('1', 'John', 'Snow'); 

INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('2', 'Mike', 'Tyson'); 

INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('3', 'Bill', 'Keaton'); 

INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('4', 'Greg', 'Mercury'); 

INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('5', 'Steve', 'Jobs'); 

INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('6', 'Stsdsdve', 'Josdsbs');

INSERT INTO sql_test_b (ID, FIRST_NAME, LAST_NAME) VALUES ('1', 'John', 'Snow'); 

INSERT INTO sql_test_b (ID, FIRST_NAME, LAST_NAME) VALUES ('2', 'Mike', 'Tyson'); 

INSERT INTO sql_test_b (ID, FIRST_NAME, LAST_NAME) VALUES ('3', 'Bill', 'Keaton'); 

INSERT INTO sql_test_b (ID, FIRST_NAME, LAST_NAME) VALUES ('4', 'Greg', 'Mercury'); 

INSERT INTO sql_test_b (ID, FIRST_NAME, LAST_NAME) VALUES ('5', 'Steve', 'Jobs'); 

INSERT INTO sql_test_b (ID, FIRST_NAME, LAST_NAME) VALUES ('7', 'Johhny', 'Depp');

INSERT INTO sql_test_b (ID, FIRST_NAME, LAST_NAME) VALUES ('8', 'Johhnaaaay', 'Deaaap');

это таблицы и записи в таблицах

и выходное значение должно быть

ID  FIRST_NAME  LAST_NAME
1   John        Snow
2   Mike        Tyson
3   Bill        Keaton
4   Greg        Mercury
5   Steve       Jobs
6   Stsdsdve    Josdsbs
7   Johhny      Depp
8   Johhnaaaay  Deaaap

я пробовал другое соединение, такое как левое внешнее соединение, полное внешнее соединение и т. Д.

SELECT a.ID,a.FIRST_NAME,a.LAST_NAME
  FROM sql_test_a a left outer join sql_test_b b on a.ID=b.ID 
  and a.FIRST_NAME=b.FIRST_NAME 
  and a.LAST_NAME=b.LAST_NAME  

этот запрос не даст точного результата

помогите пожалуйста

Ответы [ 4 ]

0 голосов
/ 03 июля 2018

Попробуйте, пожалуйста

(ВЫБРАТЬ * ИЗ sql_test_1 ) UNION ALL (ВЫБРАТЬ * ИЗ sql_test_b КРОМЕ SELECT * FROM sql_test_1)

0 голосов
/ 03 июля 2018

Если вы используете union, вы можете получить необходимый список (обратите внимание, что union all может дать вам повторяющиеся строки в зависимости от ваших данных):

select a.id as id, a.first_name as first_name, a.last_name as last_name
from sql_test_a a

union

select b.id as id, b.first_name as first_name, b.last_name as last_name
from sql_test_b b

В этом случае не рекомендуется использовать объединение, поскольку оно даст вам таблицу с более чем тремя столбцами, объединенными (по крайней мере) в одном из них.

EDIT

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

with tmp as (

    select a.id as id, a.first_name as first_name, a.last_name as last_name
    from sql_test_a a

    union

    select b.id as id, b.first_name as first_name, b.last_name as last_name
    from sql_test_b b
)

select tmp.id, tmp.first_name, tmp.last_name
from tmp
where 
    tmp.first_name like '%whatever%';
0 голосов
/ 03 июля 2018

Оператор UNION возвращает уникальные строки комбинированных запросов. Так что просто используйте

SELECT * FROM sql_test_a UNION SELECT * FROM sql_test_b

Чтобы отфильтровать результат с помощью предложения WHERE, вы можете использовать подзапрос. Например

SELECT *
FROM (SELECT * FROM sql_test_a UNION SELECT * FROM sql_test_b)
WHERE ID > 3

См. Также Живая скрипка .

0 голосов
/ 03 июля 2018
(   SELECT * FROM sql_test_a 
MINUS
SELECT * FROM sql_test_b)  UNION ALL(   SELECT * FROM sql_test_b
MINUS
SELECT * FROM sql_test_a ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...