planetz Ответов: 2

Делая оракул левое соединение запрос простой


Всем привет,

У меня есть 2 стола:

1. ппл
ename | edept
ram |	sales
sham |	sales
jadu |	hr
madhu |	hr
sita |	sales
mohan |	sales

2. Задача
ename | tdate
ram |	01-10-17
jadu |	01-10-17
mohan |	01-10-17

Для tdate= '01-oct-2017' выход должен быть:
ename |	edept |	tdate
jadu |	hr |	01-10-2017
madhu |	hr |	
mohan |	sales |	01-10-2017
ram |	sales |	01-10-2017
sham |	sales |	
sita |	sales |	

В основном левое соединение ppl с задачей для конкретного tdate

Вот мой вопрос. Это работает, но может ли это быть просто?

select ppl.ename,ppl.edept,ntbl.tdate from
ppl left join
(select task.ename as ename , ppl.edept, task.tdate as tdate
from ppl,task
where ppl.ename= task.ename 
and task.tdate='01-oct-2017') ntbl
on ppl.ename=ntbl.ename
order by ename;


Что я уже пробовал:

select ppl.ename as ename , ppl.edept, task.tdate as tdate
from ppl left join task
on ppl.ename=task.ename
where task.tdate='01-oct-2017';

Это не работает так, как ожидалось, и дает только для ename в задаче.

2 Ответов

Рейтинг:
12

Richard Deeming

Цитата:
select ppl.ename as ename , ppl.edept, task.tdate as tdate
from ppl left join task
on ppl.ename=task.ename
where task.tdate='01-oct-2017';

Ваш LEFT JOIN возвращает все строки из ppl, и любые совпадающие строки из task. Для ppl строки, которые не имеют соответствующего task строка, результат будет иметь Null значения для всех task столбцы.

Ваш WHERE затем предложение фильтрует результат на основе tdate колонка из task быть равным определенному значению. Для ppl строки без task строки, Этот фильтр будет нет быть встреченным, потому что Null не равно этому значению.

Вам нужно переместить фильтр даты вверх на JOIN:
SELECT
    ppl.ename, 
    ppl.edept, 
    task.tdate
FROM
    ppl 
    LEFT JOIN task
    ON ppl.ename = task.ename
    AND task.tdate = '01-oct-2017'
;


planetz

Это именно то, чего я хочу. Это сработало, и запрос понятен. Спасибо...!!

Рейтинг:
0

GKP1992

Это происходит из-за условия where, оно ограничивает вывод строками, которые проходят условие where. Удалите его, и ваш запрос будет работать. Однако вам нужно пересмотреть свой дизайн БД или свой запрос.

Чтобы увидеть, работает ли левое соединение, напишите что-то вроде

select ppl.ename as ename , ppl.edept, task.tdate as tdate
from ppl left join task
on ppl.ename=task.ename
where ppl.edept='sales';


planetz

Но дата-это важный фильтр. Я не могу оставить это без внимания. Пользователь выберет дату, и вывод будет осуществляться в соответствии с ней.