2016-04-21 47 views
1

我似乎有問題得到某個查詢工作。我知道我很親密。這裏是一個copy of my er diagramsql加入並減去

我想我是如此接近實現我想用這個代碼做的事情,只有當我試圖運行它時會得到無效的標識符。我認爲這是因爲練習在加入後有所改變,因爲我只在第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的做法,幷包含一些信息,例如CITY和practice_address。

我可以用負結構,以找出有多少員工沒有GP的像這樣的角色:

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'; 

這是不會給你想要什麼,雖然,它只會刪除GP員工的行數,而不是所有GP的實踐跟蹤 - 所有實踐中的非GP員工仍將顯示。

如果你不想要剩下的員工細節,你只需要在選擇列表中包含練習表中的列,然後減號會給你你想要的東西(Gordon Linoff已經顯示了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

我將如何使用不存在的聲明呢?替換minus不存在,然後將括號括在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' 
       ); 

我覺得這是你的問題的最簡單,最直接的解釋。