2016-04-21 3 views
1

Кажется, у меня проблемы с получением определенного запроса на работу. Я знаю, что я так близко. Вот copy of my er diagramsql join и минус

Я думаю, что я настолько близок к достижению того, что хочу делать с этим кодом, только когда получаю недопустимый идентификатор при попытке запустить его. Я думаю, что это потому, что практика менялась как-то после присоединения, так как я только получаю недопустимый идентификатор в строке 5?

SELECT staffid, staff_firstname, staff_surname, practice.practice_name, practice.practice_city 
from staff 
join practice on staff.practiceid = practice.practiceid 
MINUS 
SELECT staffid, staff_firstname, staff_surname, practice.practice_name, practice.practice_city 
from staff 
where role = 'GP'; 

В основном я пытаюсь использовать минус конструкцию, чтобы найти методы, которые не используют GP и включают в себя некоторую информацию, такую ​​как город и practice_address.

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

SELECT staffid, staff_firstname, staff_surname 
from staff 
MINUS 
SELECT staffid, staff_firstname, staff_surname 
from staff 
where role = 'GP'; 

где я получаю результаты:

STAFFID STAFF_FIRS STAFF_SURN 
__________ __________ __________ 
     8 NYSSA  THORNTON 
     9 MONA  BRADSHAW 
     10 GLORIA  PENA 

Я изо всех сил использовать соединение с минусовой конструкцией для получения информации о практическом адресе GP и городе и т. д.

Любая помощь будет принята с благодарностью!

+0

Запрос seond после минуса не входит в таблицу практических занятий? –

+0

Ничего себе ... спасибо ха-ха! – user3357649

ответ

2

Второй выбор, после минуса, имеет в виду столбцов из таблицы практики - но не присоединяется к нему:

SELECT staffid, staff_firstname, staff_surname, 
    practice.practice_name, practice.practice_city 
from staff 
join practice on staff.practiceid = practice.practiceid 
MINUS 
SELECT staffid, staff_firstname, staff_surname, 
    practice.practice_name, practice.practice_city 
from staff 
join practice on staff.practiceid = practice.practiceid 
where role = 'GP'; 

Это не собирается, чтобы дать вам то, что вы хотите, хотя, он просто удалит строки для сотрудников, которые являются врачами общей практики, и не все следы практики, в которых есть какие-либо врачи общей практики - сотрудники, не являющиеся врачами общей практики, по-прежнему будут показаны.

Если вы не хотите, чтобы оставшиеся сведения о персонале вам нужно было включать столбцы из таблицы практик в списки выбора, а минус затем дал бы вам то, что вы хотите (и Гордон Линофф показал две альтернативы minus в таком случае). Если вы хотите, чтобы оставшиеся детали сотрудников, то вы можете использовать не-существует пункт, а не minus - что-то вроде:

select s.staffid, s.staff_firstname, s.staff_surname, 
    p.practice_name, p.practice_city 
from staff s 
join practice p on s.practiceid = p.practiceid 
where not exists (
    select 1 
    from staff s2 
    where s2.practice_id = p.practice_id 
    and s2.role = 'GP 
); 

Это похоже на второй запрос Гордона, но дополнительно присоединиться к staff для деталей. Опять же, если вы этого не хотите, используйте более простой запрос Гордона.

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

+0

Как я могу использовать инструкцию для не существует? замените минус на отсутствие, а затем поместите скобки вокруг выражения select? – user3357649

+0

@ user3357649 - добавлена ​​грубая версия не существует. –

1

Ваш исходный запрос работает только на уровне «персонал», а не «на практике». Я был бы склонен решить это с помощью агрегации:

select p.practice_name, p.practice_city 
from staff s join 
    practice p 
    on s.practiceid = p.practiceid 
group by p.practice_name, p.practice_city 
having sum(case when s.role = 'GP' then 1 else 0 end) = 0; 

Или еще лучше:

select p.* 
from practice p 
where not exists (select 1 
        from staff s 
        where s.practiceid = p.practiceid and s.role = 'GP' 
       ); 

Я думаю, что это самый простой и прямой интерпретации вашего вопроса.