2016-08-01 6 views
2

Я использую Oracle 10g, и я пытаюсь выбрать строки из одной таблицы, которые не отображаются в другой таблице запроса, используя оператор set.SQL Set Operators - выбор строк из таблиц с разными столбцами

Я пытаюсь выбрать id, last_name и first_name столбцов из employee таблицы, в которой эти строки не отображаются в job_history таблицы.

Единственный общий столбец в этих двух таблицах - столбец id. Но я хочу также показать имена.

Я попытался:

SELECT 
    id, last_name, first_name 
FROM 
    employees 

MINUS 

SELECT 
    id, TO_CHAR(null), TO_CHAR(null) 
FROM 
    job_history; 

Который не дает желаемого результата.

Однако, если я не хочу, чтобы отобразить имена из таблицы сотрудников, я использую:

SELECT id FROM employees 
MINUS 
SELECT id FROM job_history; 

Который дает мне половину результата, за исключением, что я хочу, чтобы имена из таблицы сотрудников ,

Любые советы?

ответ

2

Вы можете использовать внутреннее соединение в результате выбора

select a.id, a.last_name, a.first_name 
from employees a 
inner join ( 
SELECT id FROM employees 
MINUS 
SELECT id FROM job_history) x on x.id = a.id 
+0

Это привело к правильному результату для меня. Не могли бы вы предоставить объяснение для 'x on x.id = a.id'? Я никогда не сталкивался с этим синтаксисом. – ethane

+0

Да .. конечно .. x - это псевдоним для таблицы, созданной с использованием подзапроса .. и на x.id = a.id - это предложение соединения между сотрудниками таблицы (псевдоним a) и таблицей подсекции. ясно .. в противном случае .. спросите меня снова – scaisEdge

+0

Отлично! Это прояснилось, спасибо. – ethane

4

Почему нельзя просто использовать NOT IN как

SELECT id, last_name, first_name FROM employees 
WHERE ID NOT IN (SELECT id FROM job_history); 

Вы можете также попробовать LEFT JOIN как

SELECT e.id, e.last_name, e.first_name 
FROM employees e LEFT JOIN job_history jh 
ON e.ID = jh.ID 
WHERE jh.some_other_column IS NULL; 
+1

Это кажется самым разумным ответом. –

+0

Я знаю, что есть более простые способы получения результата, но я пытаюсь понять, как использовать операторы множеств. – ethane

+0

Решение NOT IN приведет к неправильному результату, если в столбце job_history.id есть NULL. Этот столбец не должен быть NULL из того, что мы можем сказать, но это нужно проверить первым. – mathguy